1.逐步构建卷积网络
本次要构建的网络基本架构:
注:每进行一次前向传播操作,都会有与之对应的后向传播,前向传播的参数将被存储,这些参数在后向传播过程中将被用来计算梯度。
2.卷积神经网络
2.1零值填充
使用零值填充的好处:
a_slice_prev = a_prev_pad[vert_start : vert_end, horiz_start : horiz_end, :]
2.4池化层
2.4.1前向池化
设计最大池化层和平均池化层
2.5后向传播(可选)
2.5.1卷积网络逆推法
公式:
2.5.2池化层的逆推法
2.5.2.1最大池化
在开始最大池化之前,首先要构造一个辅助函数 create_mask_from_window() 它的功能是执行最大池化。将最大元素位置显示为1,其余为置0.之后的平均池化也会用到类似的方法,只是使用的“mask”不同。
注:暂时不考虑有多个最大值的情况。
为什么我们要跟踪max的位置?这是因为他会影响最终的成本。Backprop计算的是相对于成本的梯度,所以任何影响最终成本的东西都应该有一个非零梯度。因此,backprop将梯度“传播”回影响成本的特定输入值(即最大值)。
最大池化实现:
mask = (x == np.max(x))
注:不仅要找到最大的值,还要通过比较给出1/0的结果。
2.5.2.2平均池化
平均池化与最大池化的不同在于,每个元素都会对输出值造成影响,而不像最大池化只有最大值需要被考虑。
为平均池化构造辅助函数。
函数说明:
numpy.ones(shape, dtype=None, order=‘C’)
根据给定的类型返回一个用1填充的数组。
np.ones(5) array([ 1., 1., 1., 1., 1.])
默认数字类型是浮点数,可以设置。
np.ones((5,), dtype=np.int) array([1, 1, 1, 1, 1])
s = (2,2) np.ones(s) array([[ 1., 1.], [ 1., 1.]])
最终实现如下:
def distribute_value(dz, shape): """ Distributes the input value in the matrix of dimension shape Arguments: dz -- input scalar shape -- the shape (n_H, n_W) of the output matrix for which we want to distribute the value of dz Returns: a -- Array of size (n_H, n_W) for which we distributed the value of dz """ ### START CODE HERE ### # Retrieve dimensions from shape (≈1 line) (n_H, n_W) = shape#shape是一个元组不能执行.shape的功能 # Compute the value to distribute on the matrix (≈1 line) average = dz/(n_H*n_W) # Create a matrix where every entry is the "average" value (≈1 line) a = average*np.ones(shape) ### END CODE HERE ### return a
利用 np.ones(shape) 将生成的平均值排列成与输入具有相同格式的数组。
2.5.2.3 将池化逆推放到一起
关键步骤记录:
1.设置dA_prev
dA_prev[i, vert_start:vert_end, horiz_start:horiz_end, c] += np.multiply(mask , dA[i, h, w, c])