卷积神经网络学习笔记
全连接神经网络的结构
-
全连接神经网络的整体结构

可以简化为智能函数 \(y = f_θ(x)\)
输入和输出层一般为数据矩阵 -
全连接网络的单元结构
神经网络的思路:从单元到整体
一个单元的结构:

\(X_1, X_2, X_3...\)是很多矩阵,然后这些矩阵分别乘上对应的权重矩阵,再加上偏置矩阵b,输入给激活函数,就会输出结果用数学形式表达就是:
\(y_1 = h(X_1W_1 + X_2W_2 + X_3W_3 + b)\)
(\(h(x)\)为激活函数)所以如果想输出优质结果,就要调整各个输入的权重W
下一层的神经网络以这一层的输出为输入,进行同样的运算:
\(y_2 = h(y_1W + b)\)
激活函数
-
为什么激活函数一般不用线性函数?
若\(h(x) = kx + b\),则下一层的运算结果\(h((h(x)) = k^2x + kb + b\),仍为\(y = kx + b\)形式,也就是说没有体现出层数增加带来的效果
-
sigmoid函数
\(y = \frac{1}{1+e^{-z}}\)
\(y' = y(1-y)\)

特点:值域为(0,1),在x接近0处梯度较好
优点:- 简单,适合分类任务
缺点
- 在远离0的地方梯度过小,反向传播算法会出问题
- 值域不关于0对称
-
tanh激活函数(双曲正切函数)
\(y = \frac{e^z-e^{-z}}{e^z+e^{-z}}\)
\(y' = 1-y^2\)

特点:
- 与sigmoid函数很像
- 值域为(-1,1),关于0对称
优点:
- 比sigmoid收敛快
- 值域关于0对称
缺点
- 可能出现梯度消失问题
-
ReLU函数
\(y = \begin{cases} 0, &x\leq0\\ x, &x>0 \end{cases}\)
\(y' = \begin{cases} 0, &x\leq0\\ 1, &x>0 \end{cases}\)

特点:
- 分段函数
优点:
- 解决了梯度消失问题
- 没有指数运算,运算更为简便
缺点:
- 可能会出现神经元死亡的问题(也就是当x<0的时候,梯度为0,参数不再更新)
-
leaky ReLU函数
\(y = \begin{cases} ax, &x\leq0\\ x, &x>0 \end{cases}(a\neq1)\)
\(y' = \begin{cases} a, &x\leq0\\ 1, &x>0 \end{cases}\)
特点:
- 分段函数
优点:
- 不会出现神经元死亡的问题
缺点:
- 对正、负的输入,对应的函数不同,无法进行一致的关系预测
损失函数
\(J(x) = \frac{1}{2m}\sum\limits_{i=1}^m(f(x_i)-y_i)^2\)
这里用1/2m而不是1/m是为了方便求导
神经网络的训练流程:
- 前向传播
- 计算误差
- 反向传播
反向传播
梯度下降算法
\(w = w_0 - a\frac{\partial J}{\partial w}\)
\(b = b_0 - a\frac{\partial J}{\partial b}\)
关于梯度下降算法的原理:
对一个函数\(f(x, y), 在随机一点(ω_0, f_0)泰勒展开,取前两项,得f(ω) = f(ω_0) + \nabla f(ω_0)(ω - ω_0)\),\(\nabla f(ω_0)\)是函数的梯度
移项得
\(f(ω) - f(ω_0) = \nabla f(ω_0)(ω - ω_0)\)
令\(ω = ω_{t+1}, ω_0 = ω_t\),则左边衡量的是下降前后函数值的变化量,这个变化量为负,且我们希望它尽可能小
现在研究右边,设\(ω - ω_0 = \Delta ω\),这是一个向量,\(\nabla f(ω_t)\)也是个向量,也就是让这两个向量的内积尽量小,所以他们俩应该共线反向
所以\(\Delta ω = -||\Delta ω||\frac{\nabla f(ω_t)}{||\nabla f(ω_t)||}\)
因此\(ω_{t+1} - ω_t = -||\Delta ω||\frac{\nabla f(ω_t)}{||\nabla f(ω_t)||}\)
移项得\(ω_{t+1} = ω_t - ||\Delta ω||\frac{\nabla f(ω_t)}{||\nabla f(ω_t)||}\)
设学习率\(a = \frac{||\Delta ω||}{||\nabla f(ω_t)||}\),则得到梯度下降公式
计算机对图像的存储
每个像素点记录为一个数,灰度图为一个矩阵,彩色图为RGB三通道矩阵
全连接层的缺点
参数量过大,难以计算,容易过拟合
卷积神经网络
- 卷积运算
卷积核在输入矩阵上滑动,运算方式是将卷积核与原矩阵对应的元素相乘再求和,再加上偏置,形成输出的一个元素。

卷积核的各个元素就相当于全连接的参数W
卷积有两个特殊的值:步长(Stride)和填充(Padding)
- 填充就是在图像的周围补0,补几圈P就等于几
- 步长就是卷积核每次移动的距离
如何计算输出矩阵的高宽?
设原矩阵高为H,宽为W,输出的矩阵高宽为OH、OW,卷积核高宽为FH、FW,则
\(OH = \frac{2P + H - FH}{S} + 1\)
\(OW = \frac{2P + W - FW}{S} + 1\)
如果多通道的图片进行卷积,卷积核也是多通道的,但输出的图会把对应的元素进行相加,成为一个单通道图片
卷积核可以有多个,如果多个卷积核,就会输出多个特征图
- 池化运算
也有类似卷积的核和步长,是一个核滑动的形式,但是没有参数(这个核称作“感受野”)

池化有两种常见类型
- 最大池化:取池化范围的最大值作为输出的元素
- 平均池化:取池化范围的平均值作为输出的元素
- 卷积神经网络的整体构造

深度神经网络的模型搭建
程序结构
model.py:模型
train.py
- 数据处理
- 模型训练
- 记录loss值、accuracy值
test.py:对数据测试
如果修改模型,可以只改model.py,train和test不用怎么改

浙公网安备 33010602011771号