在数据处理中常常使用标准化技术对数据进行处理,一般来说标准化处理有利于提升模型对数据的拟合效果。我们也可以使用标准化技术对神经网络模型进行升级。
批量标准化
使用批量标准化BatchNormalization方法,我们可以对神经网络模型进行优化。批量标准化的数学公式如下:
$$ y = \frac{x - E[x]}{\sqrt{Var(x) + \epsilon}} \ast \gamma + \beta $$
公式当中的 $\epsilon$ 通常会是一个非常小的正数,用于防止程序出现除0错误,故此公式可以看成:
$$ y = \frac{x - E[x]}{\sqrt{Var(x)}} \ast \gamma + \beta $$
即: $x$ 减去 $x$ 的期望 $E[x]$ 然后除以方差 $Var(x)$ 的开根,再乘上参数 $\gamma$ 最后加上参数 $\beta$ 。其中参数 $\gamma , \beta$ 是需要训练更新的值,在PyTorch中,初始情况下 $\gamma$ 的元素值被设置为1而 $\beta$ 的元素值被设置为0。
优化代码
我们对之前的卷积神经网络进行优化,先前的模型结构如下:
cnn = nn.Sequential(
nn.Conv2d(1, 10, 5),
nn.ReLU(inplace=True),
nn.MaxPool2d(2),
nn.Conv2d(10, 20, 3),
nn.ReLU(inplace=True),
nn.MaxPool2d(2),
nn.Flatten(),
nn.Linear(20 * 5 * 5, 10),
nn.Softmax(dim=1))
经过优化后的结构如下:
cnn = nn.Sequential(
nn.Conv2d(1, 10, 5),
nn.BatchNorm2d(10),
nn.ReLU(inplace=True),
nn.MaxPool2d(2),
nn.Conv2d(10, 20, 3),
nn.BatchNorm2d(20),
nn.ReLU(inplace=True),
nn.MaxPool2d(2),
nn.Flatten(),
nn.Linear(20 * 5 * 5, 10),
nn.Softmax(dim=1))
我们在卷积层nn.Conv2d
后面插入批量标准化层nn.BatchNorm2d
来实现数据标准化,需要注意的是批量标准化层的第一个参数应该被指定为卷积层输出的通道数量,例如: nn.Conv2d(1, 10, 5)
对应nn.BatchNorm2d(10)
;nn.Conv2d(10, 20, 3)
对应nn.BatchNorm2d(20)
。
重新运行代码训练模型
接下来,我们在同之前一样的条件下重新训练这个卷积神经网络。
通过10轮的训练,我们的新模型在测试集上的表现如下:
testing...
loss=1.4737657746182213, accuracy=0.9891
其中损失率loss
为1.4737657左右,准确率达到98.91%。
这一次改善在非常大的程度上提高了拟合效率,在训练进行到第二轮的时候测试集准确率就超过了上一代网络的最终测试集准确率,并且在完成10轮训练后,测试集的准确率直逼99%,如果我们增加几轮训练,估计达到99%的测试集准确率不是问题。