本文是对卷积神经网络较为精简的学习总结,主要用于记录自己的学习过程,如有不准确之处,欢迎各路大神指出!
卷积神经网络(CNN)的主要结构:输入层、卷积层、激活函数、池化层、全连接层、损失函数。不同的卷积神经网络由不同种类及数目的以上网络层组成。
卷积层:提取图像特征。
多次卷积:得到不同特征。
激活函数:使每个网络层的输出呈非线性分布,更接近真实情况,提高泛化能力。
池化层:减小特征矩阵,简化运算。
全连接层:矩阵变换,将特征映射到特定空间,获取对应目标相同的行与列。(详细细节见后)
梯度下降:计算新的权重矩阵W。
前向传播:输入层,卷积层,激活函数,池化层,全连接层。
反向传播:损失函数,反全连接,反池化,激活函数逆变换。
由于在小组项目中的不同分工,因此笔者专注于对卷积神经网络特定网络层及实现代码的学习,部分内容则较为简略。
全连接层原理理解:
例:输入两个图像 2*32*8*8
转化为两个行向量 2*2048
超参数 2048*200
输出矩阵 2*200
即完成了矩阵变换。
1.引入numpy函数库,名称为np。
import numpy as np
2. 将输入图像x的特征矩阵转换为行向量。
N = x.shape[0]
x_row = x.reshape(N, -1)
-1表示不知道具体有多少列,但是指定行便能算出列。
numpy.reshape()函数用于给数组一个新的形状而不改变其数据。
3.进行矩阵变换后输出。
out = np.dot(x_row, w) + b
np.dot()函数功能:向量点积和矩阵乘法。
4.反向传播
def affine_backward(dout, cache):
def用于定义一个函数体。
5.RELU激活函数(前向传播)
def relu_forward(x):
out = None
out = ReLU(x)
cache = x
return out, cache
relu激活函数能解决sigmoid激活函数梯度消失问题,网络性能比sigmoid更好。
6.RELU激活函数(反向传播)
def relu_backward(dout, cache):
dx, x = None, cache
dx = dout
dx[x <= 0] = 0
return dx
relu激活函数特点:x<0时,导数为0。