NumPy ile zero-padding

İlk olarak zero-padding yapmamızın sebebi nedir onu anlatayım.

Evrişim kanal boyutlarını azaltır. Her bir evrişimli katmanda tanımladığımız filtrelerimiz vardır ve bu filtrelerimizin de bilindiği üzere boyutları vardır. Bir filtre verilen bir giriş katmanıyla evriştirildiğindi bize bir çıktı katmanı verir. Bu çıktı katmanının boyutu evrişim sırasında yapılan matematiksel hesaplar sonucunda ortaya çıkmaktadır. Bu olay gerçekleşirken görüntümüzün boyutları azalır.

Mesela 28×28 boyutunda giriş katmanını 3×3 boyutunda filtreyle evriştirdiğimizde 28-3+1 yani 26×26 boyutunda bir çıkış elde ederiz. Bu çıktının girdiden biraz daha küçük olması büyük bir sorun değil, değil mi? Bu veriyi ya da herhangi bir şeyi kaybetmedik çünkü bu girdinin önemli parçalarının çoğu ortada yer alıyor. Ancak görüntünün kenarlarında anlamlı bir veriye sahip olsaydık bunun artık bir problem olacağını düşünebiliriz. İşte bu boyut azalmasının önüne geçmek için zero-padding yani görüntümüzün etrafını sıfırlarla sararız.

Sıfır dolgu, orijinal giriş boyutunu korumamıza izin veren bir tekniktir. Bu, evrişimli katmanın girişinde uyguladığımız bir şeydir. Her bir evrişimli katmanı ile, filtre sayısını ve filtrelerin boyutunu belirlediğimiz gibi, aynı zamanda dolgu malzemesinin kullanılıp kullanılmayacağını da belirleyebiliriz.

Peki gelelim kod tarafına.

Numpy ile bunu sadece bir fonksiyonda yapabiliriz.

X giriş katmanımız olsun.

def zero_pad(X, pad):
    X_pad = np.pad(X, ((0,0), (pad, pad), (pad,pad), (0,0)), 'constant',  constant_values = 0)
    return X_pad


np.random.seed(1)
x = np.random.randn(4, 3, 3, 2)
x_pad = zero_pad(x, 2)

print ("x.shape =", x.shape)
print ("x_pad.shape =", x_pad.shape)
print ("x[1,1] =", x[1,1])
print ("x_pad[1,1] =", x_pad[1,1])

Çıkış olarak şöyle bir şey alırız:

x.shape = (4, 3, 3, 2)
x_pad.shape = (4, 7, 7, 2)
x[1,1] = [[ 0.90085595 -0.68372786]
 [-0.12289023 -0.93576943]
 [-0.26788808  0.53035547]]
x_pad[1,1] = [[0. 0.]
 [0. 0.]
 [0. 0.]
 [0. 0.]
 [0. 0.]
 [0. 0.]
 [0. 0.]]

Çıkışımızın görselleştirilmiş hali:

Kaynak

http://deeplizard.com/learn/video/qSTv_m-KFk0

https://docs.scipy.org/doc/numpy/reference/generated/numpy.pad.html