吴恩达深度学习编程作业第四周第一节——Convolution model-step by step v1/v2

1.逐步构建卷积网络
本次要构建的网络基本架构:
吴恩达深度学习编程作业第四周第一节——Convolution model-step by step v1/v2
注:每进行一次前向传播操作,都会有与之对应的后向传播,前向传播的参数将被存储,这些参数在后向传播过程中将被用来计算梯度。
2.卷积神经网络
吴恩达深度学习编程作业第四周第一节——Convolution model-step by step v1/v2
2.1零值填充
吴恩达深度学习编程作业第四周第一节——Convolution model-step by step v1/v2
使用零值填充的好处:

  1. 填充帮助你使用卷积层而不需要收缩输入数据的高和宽,这在深度网络中十分重要;
  2. 帮助保留图片边缘信息
    使用函数 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前向池化
设计最大池化层和平均池化层
吴恩达深度学习编程作业第四周第一节——Convolution model-step by step v1/v2
2.5后向传播(可选)
2.5.1卷积网络逆推法
公式:
吴恩达深度学习编程作业第四周第一节——Convolution model-step by step v1/v2
吴恩达深度学习编程作业第四周第一节——Convolution model-step by step v1/v2
吴恩达深度学习编程作业第四周第一节——Convolution model-step by step v1/v2
2.5.2池化层的逆推法
2.5.2.1最大池化
在开始最大池化之前,首先要构造一个辅助函数 create_mask_from_window() 它的功能是执行最大池化。将最大元素位置显示为1,其余为置0.之后的平均池化也会用到类似的方法,只是使用的“mask”不同。
吴恩达深度学习编程作业第四周第一节——Convolution model-step by step v1/v2
注:暂时不考虑有多个最大值的情况。
为什么我们要跟踪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])
上一篇:案例 | 如何以Sonar为例创建一个适用与所有企业的测试步骤


下一篇:负载测试/压力测试工具 NBomber