1.逐步构建卷积网络
本次要构建的网络基本架构:
注:每进行一次前向传播操作,都会有与之对应的后向传播,前向传播的参数将被存储,这些参数在后向传播过程中将被用来计算梯度。
2.卷积神经网络
2.1零值填充
使用零值填充的好处:
- 填充帮助你使用卷积层而不需要收缩输入数据的高和宽,这在深度网络中十分重要;
- 帮助保留图片边缘信息
使用函数 numpy.pad 介绍:
numpy.pad(array, pad_width, mode=‘constant’, **kwargs)
array:要填充的数组
pad_width:(before,after)简单来说就是前面填几和后面填几,如(2,3)就是前填2后填3
“constant”:默认填常数,可以选择别的
2.2 卷积中的一步
在本部分中,实现卷积的单个步骤,将滤波器应用于输入的单个位置。这将用于构建卷积单元。
2.3 卷积神经网络的前向传播
在这一节中,使用单个过滤器进行卷积操作,得到的结果是2D的将所得结果叠加到一起生成一个3D结果。
过程:
1.选择一个切片2*2
提示:a_slice_prev = a_prev[0:2,0:2,: ] “a_prev” (shape (5,5,3))
2.定义一个切片
需要定义4个角:vert_start, vert_end, horiz_start ,horiz_end
vert_start = h * stride
vert_end = vert_start + f
horiz_start = w * stride
horiz_end = horiz_start + f
定义3D切片:
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])