卷积神经网络的应用:
卷积神经网络使用卷积提取图像的特征来进行图像的分类和识别
分类 相似图像搜索 目标识别 语义分割
卷积神经网络与神经网络的形状对比, 卷积是有厚度的
卷积在提取特征时的图像变化,从刚开始较低水平的特征图,到最后较高水平的特征图的变化,原先提取的是图片的特征,后面提取到的是一些高级的分类特征
1. 卷积的实际计算过程:假设样本的维度为N, C, H, W, 卷积的维度为F, C, H, W, F表示有几个卷积核, C表示卷积的通道,每一个卷积都与每个特征图做一次卷积操作,即对应位置相乘操作,因此样本的通道和卷积的通道必须是相同的,最后将3个通道相乘的结果,进行加和,最后加上一个b,获得一个特征图, 卷积后的维度等于N, F, H, W
第一次卷积 向右移动一个stride
代码:
# 将C通道分别进行相乘,和最后的相加操作,再加上一个b值,作为最后的输出 out[i, f, j, k] = np.sum(x_pad[i, :, j*s:j*s+HH, k*s:k*s+WW] * w[f]) + b[f]
2. 卷积的参数共享: 卷积的操作共享表示的是,对于一个特征图的卷积,只使用一个卷积核进行卷积,因此降低了参数的数量
3. 卷积后的维度计算, 卷积后的维度,第一个维度:参与卷积样本的数目N, 第二个参数F,表示卷积核的个数,
第三个参数: H_new = int(H-HH + 2*pad) / stride + 1, 第四个参数:W_new = int(W-WW + 2*pad) / stride + 1, 特征图维度W,卷积核维度WW, pad表示补零的层数,stride表示卷积核每次移动的步长
代码:
# 进行卷积后的H和W的维度计算 H_new = int((H - HH + 2*pad) / stride + 1) W_new = int((W - WW + 2*pad) / stride + 1)
4.pool池化操作, 为了在后续的操作中,可以更好的提取特征,因此压缩了矩阵的维度,池化操作分为两种:最大值池化和均值池化, 选择选框中最大的数作为池化的结果
池化操作 最大值池化
代码:
# 将图像上卷积区域的最大值,赋值给池化后的数据 out[i, c, j, k] = np.max(x[i, c, j*s:j*s+HH, k*s:k*s+WW])
5.图像卷积的流程: 下图的卷积的流程:卷积-relu激活-卷积-relu激活-池化... 池化-全连接(进行图像的类别预测)
6. 卷积的反向传播 , 卷积的反向传播,分为dx, dw, db
对于dx = dout * w, dw = dout * x , db += dout 进行加和
代码:
# 获得前向传播的x windows = x_pad[i, :, j*s:j*s+HH, k*s:k*s+WW] # dw[f] = dout[i, f, j, k] * x dw[f] += dout[i, f, j, k] * windows # dx = dout * w dx[i, :, j*s:j*s+HH, k*s:k*s+WW] += dout[i, f, j, k] * w[f] # db[f] += dout[i, f, j, k] db[f] += dout[i, f, j, k]
7. 池化的反向传播
获得前向传播的X, 构造(X == dout(i, f, j, k)) * dout(i, f, j, k),显示出[0, 0, 0, 6] 这样的矩阵
代码:
# 生成[[false, false],[false, True]] window = (np.array(x[i, c, j*s:j*s+HH, k*s:k*s+WW]) == dout[i, c, j, k]) # [[false, false],[false, True]] * dout[i, c, j, k] = [[0, 0], [0, dout[i, c, j, k]] out[i, c, j*s:j*s+HH, k*s:k*s+WW] = window * dout[i, c, j, k]