学习内容:
numpy 卷积函数,包括零填充、卷积窗口、前向卷积、反向卷积;池化函数,包括前向池化、mask、分配直,反向池化。
对比 tensorflow
定义函数:
def zero_pad(X, pad):
X_pad = np.pad(X, ((0, 0), (pad, pad), (pad, pad), (0, 0)), 'constant', constant_values=(0, 0))
return X_pad
-----------------------------------------------------------
def conv_single_step(a_slice_prev, W, b):
s = a_slice_prev * W
Z = np.sum(s)
Z = Z + b
return Z
--------------------------------------------------------------
def conv_forward(A_prev, W, b, hparameters):
(m , n_H_prev, n_W_prev, n_C_prev) = A_prev, shape
(f, f, n_C_prev, n_C) = W.shape
stride = hparameters['stride']
pad = hparameters['pad']
n_H = int(n_H_prev - f + 2 * pad) / stride +1)
n_W = int(n_W_prev - f + 2 * pad) / stride +1)
Z = np.zeros((m, n_H, n_W, n_C))
A_prev_pad = zero_pad(A_prev, pad)
for i in range(m):
a_prev_pad = A_prev_pad[i, :, :, :]
for h in range(n_H):
for w in range(n_W):
for c in range(n_C)
vert_start = stride * h
vert_end = vert_start + f
horiz_start = stride * w
horiz_end = horiz_start + f
a_slice_prev = a_prev_pad(vert_start : vert_end, horiz_start : horiz_end, :]
Z[i, hw, w, c] = conv_single_step(a_slice_prev, W[:,:,:, c], b[:,:,:,c])
cache = (A_prev, W, b, hparameters)
return Z, cache
-----------------------------------------------------------------
def pool_forward(A_prev, hparameters, mode = 'max'):
(m, n_H_prev, n_W_prev, n_C_prev) = A_prev.shape
f = hparameters['f']
stride = hparameters['stride']
n_H = int(1 + (n_H_prev -f) / stride)
n_W = int(1 + (n_W_prev - f) / stride)
n_C = n_C_prev
A = np.zero