训练神经网络
对当前输入的感受野,只与滤波器的大小有关,与padding和stride无关,
对网络输入的感受野:
r
0
=
∑
l
=
1
L
(
(
k
l
−
1
)
∏
i
=
1
l
−
1
s
i
)
+
1
r_0=\sum_{l=1}^L((k_l-1)\prod_{i=1}^{l-1}s_i)+1
r0=∑l=1L((kl−1)∏i=1l−1si)+1
激活函数
ReLU:max(0,x):
- 在正数区域,梯度不会消失
- 计算效率非常高
- 收敛速度很快
问题:
- 输出不是以0为中心
- 负数区域梯度为0(神经元“死掉”)
Leaky ReLU:
y
=
{
x
,
x
>
0
0.01
x
,
x
≤
0
y=\begin{cases}x,x>0\\ 0.01 x,x\leq 0\end{cases}
y={x,x>00.01x,x≤0
任何时候梯度都不会为0(神经元不会“死掉”)
输出以0为中心的好处:模型训练收敛更快
使用建议:使用ReLU,可以尝试Leaky ReLU,尽量避免使用sigmoid/tanh
数据预处理:
X ′ = X − μ σ X'=\frac{X-\mu}{\sigma} X′=σX−μ, μ \mu μ是训练集的均值, σ \sigma σ是训练集的标准差, X ′ X' X′是归一化后的数据
将权重全部设置为一个常量的话:不管进行多少轮正向传播以及反向传播,每俩层之间的参数都是一样的。换句话说,本来我们希望不同的结点学习到不同的参数,但是由于参数相同以及输出值都一样,不同的结点根本无法学到不同的特征!!!这样就失去了网络学习特征的意义。
dropout
在模型训练的每次前向传播计算中,将一些神经元随即设置为0,让网络学习冗余表示,防止特征的协同适应
Stochastic Depth
随机网络深度
训练时:随机跳过某些层
测试时:使用所有层
数据增强
水平翻转、锐化、随即裁剪和缩放、颜色扰动
超参数选择:
- 检查初始损失(关闭权重衰减)
- 过拟合少量样本
- 选择合适的lr
- 粗调1-5epochs
- 细调10-20epochs
- 检查损失和准确率曲线
- 如果第六步出现问题,返回第五步