深度学习笔记(十二)—— 训练过程监视[Babysitting The Learning Process]

  这是深度学习笔记第十二篇,完整的笔记目录可以点击这里查看。
  
  在神经网络的训练过程中,有许多有用的量需要监控。下面介绍的几种曲线图是分析训练过程的有用工具,可以用来获得关于不同超参数设置的直观信息,以及如何更改这些参数以提高训练效率。
  下面的图的x轴都是以epoch为单位,用来衡量每个样本在预期训练中被使用的次数(例如,一个epoch意味着每个例子都被使用了一次)。由于迭代次数取决于batch大小的设置,因此最好跟踪epoch而不是迭代次数。

1. Loss function

  在训练过程中,第一个有用的跟踪量是损失(loss),因为它是在前向传播过程中对各个batch进行评估的。
在这里插入图片描述  其中左图是不同学习率下损失的变化,右图是正常训练时损失随着epoch的变化情况。在右图中,损失中的“抖动”量与batch大小有关。当batch大小为1时,抖动将相对较高。当batch大小为完整数据集时,抖动将最小,因为每次梯度更新都应单调地改进损失函数(除非学习速率设置得太高)。
  有些人喜欢在log域中绘制损失函数,因为学习进度通常呈指数形式。
  如果将多个交叉验证模型绘制在同一损失图上,它们之间的差异将变得更加明显。
  从这个网站上可以看到一些有趣的损失函数图。

2. Train/Val accuracy

  训练分类器时要跟踪的第二个重要指标是验证/训练(validation/training)精度。此图可以让你深入了解模型中过度拟合的程度:
在这里插入图片描述  训练和验证精度之间的差距表明了过度拟合的程度。两种可能的情况如上图所示。蓝色的validation accuracy曲线显示,与training accuracy相比,validation accuracy非常小,表明过拟合很严重(注意,validation accuracy甚至可能在某个点之后开始下降)。在实践中看到这种过拟合时,可以通过增加正则化(更强的L2权重惩罚、更多的dropout等)或收集更多的数据来解决。另一种可能的情况是validation accuracy很好地跟踪了training accuracy(绿线所示)。这种情况表明你的模型不够大(欠拟合):可以通过增加参数的数量使模型变大。

3. Ratio of weights: updates

  可以独立地为每组参数计算和跟踪此比率。一个粗略的推断是这个比率应该在1e-3左右。如果低于此值,则学习率可能太低。如果高于此值,那么学习率可能太高。下面是一个具体的例子:

# assume parameter vector W and its gradient vector dW
param_scale = np.linalg.norm(W.ravel())
update = -learning_rate*dW # simple SGD update
update_scale = np.linalg.norm(update.ravel())
W += update # the actual update
print update_scale / param_scale # want ~1e-3

  与跟踪最小值或最大值不同,有些人更喜欢计算和跟踪梯度的范数及其更新。这些指标通常是相关的,通常会给出大致相同的结果。

4. Activation / Gradient distributions per layer

  不正确的初始化可能会减慢甚至使学习过程完全停止。幸运的是,这个问题相对容易诊断。一种方法是绘制网络所有层的激活/梯度直方图。看到任何奇怪的分布不是一个好的迹象。例如,对于tanh神经元,我们希望看到神经元激活值分布在整个[-1,1]范围,而不是看到所有的神经元输出零,或所有的神经元集中于-1或1。

5. First-layer Visualizations

  最后,如果处理的是图像像素时,可以直观地将第一层特征绘制出来:
在这里插入图片描述
  上图是神经网络第一层的权值可视化示例。左:噪声特征表明网络存在问题:网络未融合,学习率设置不当,权重正则化惩罚过低。右图:漂亮、流畅、干净和多样的特征很好地表明训练进展顺利。



*本博客翻译总结自CS231n课程作业网站,该网站需要翻墙才能访问。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
绘制损失函数曲线可以使用两种方法,一种是使用TensorBoard,另一种是使用matplotlib。 使用TensorBoard的方法如下: 首先,需要导入必要的库和函数: ```python from torch.utils.tensorboard import SummaryWriter import loadFromPickle import drwaLossFunction ``` 接下来,创建pickle文件并获取相关信息: ```python drwaLossFunction.createPickleFiles() info = loadFromPickle.getInfo() ``` 然后,使用SummaryWriter创建一个writer对象,指定保存路径: ```python writer = SummaryWriter('绘制损失函数曲线/单独绘制') ``` 使用writer对象添加scalar数据,可以通过zip(*info)将epoch、置信度损失和定位损失分别对应起来: ```python for epoch, conf, loc in zip(*info): writer.add_scalar('置信度损失', conf, epoch) writer.add_scalar('定位损失', loc, epoch) ``` 关闭writer对象: ```python writer.close() ``` 如果需要进行三者对比,可以创建一个新的writer对象,并使用add_scalars函数添加多个scalar数据: ```python writer = SummaryWriter('绘制损失函数曲线/三者对比') for epoch, conf, loc in zip(*info): writer.add_scalars('损失函数', {'conf':conf, 'loc':loc, 'conf loc': conf loc}, epoch) writer.close() ``` 最后,使用命令行运行tensorboard来查看结果: ```python tensorboard --logdir=绘制损失函数曲线 ``` 使用matplotlib的方法如下: 首先,导入必要的库和函数: ```python import drwaLossFunction import loadFromPickle import matplotlib import matplotlib.pyplot as plt ``` 创建pickle文件并获取相关信息: ```python drwaLossFunction.createPickleFiles() info = loadFromPickle.getInfo() epoch, conf, loc = info ``` 使用plt.plot函数绘制定位损失和置信度损失曲线: ```python plt.plot(epoch, loc,'rx-.', label='定位损失') plt.plot(epoch, conf, 'go-', label='置信度损失') ``` 设置横纵轴的标签和图例位置: ```python plt.xlabel('训练世代: epoch') plt.ylabel('损失: loss') plt.legend(loc='upper right', frameon=True) ``` 显示图形: ```python plt.show() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值