gpt4 book ai didi

machine-learning - 如何用debug_info解释caffe日志?

转载 作者:行者123 更新时间:2023-11-30 08:22:31 25 4
gpt4 key购买 nike

当在训练过程中遇到困难时( nansloss does not converge 等),有时通过设置 debug_info: true 查看更详细的训练日志会很有用。在 'solver.prototxt' 文件中。

训练日志看起来像这样:

I1109 ...]     [Forward] Layer data, top blob data data: 0.343971    
I1109 ...] [Forward] Layer conv1, top blob conv1 data: 0.0645037
I1109 ...] [Forward] Layer conv1, param blob 0 data: 0.00899114
I1109 ...] [Forward] Layer conv1, param blob 1 data: 0
I1109 ...] [Forward] Layer relu1, top blob conv1 data: 0.0337982
I1109 ...] [Forward] Layer conv2, top blob conv2 data: 0.0249297
I1109 ...] [Forward] Layer conv2, param blob 0 data: 0.00875855
I1109 ...] [Forward] Layer conv2, param blob 1 data: 0
I1109 ...] [Forward] Layer relu2, top blob conv2 data: 0.0128249
.
.
.
I1109 ...] [Forward] Layer fc1, top blob fc1 data: 0.00728743
I1109 ...] [Forward] Layer fc1, param blob 0 data: 0.00876866
I1109 ...] [Forward] Layer fc1, param blob 1 data: 0
I1109 ...] [Forward] Layer loss, top blob loss data: 2031.85
I1109 ...] [Backward] Layer loss, bottom blob fc1 diff: 0.124506
I1109 ...] [Backward] Layer fc1, bottom blob conv6 diff: 0.00107067
I1109 ...] [Backward] Layer fc1, param blob 0 diff: 0.483772
I1109 ...] [Backward] Layer fc1, param blob 1 diff: 4079.72
.
.
.
I1109 ...] [Backward] Layer conv2, bottom blob conv1 diff: 5.99449e-06
I1109 ...] [Backward] Layer conv2, param blob 0 diff: 0.00661093
I1109 ...] [Backward] Layer conv2, param blob 1 diff: 0.10995
I1109 ...] [Backward] Layer relu1, bottom blob conv1 diff: 2.87345e-06
I1109 ...] [Backward] Layer conv1, param blob 0 diff: 0.0220984
I1109 ...] [Backward] Layer conv1, param blob 1 diff: 0.0429201
E1109 ...] [Backward] All net params (data, diff): L1 norm = (2711.42, 7086.66); L2 norm = (6.11659, 4085.07)

这是什么意思?

最佳答案

乍一看,您可以看到此日志部分分为两部分:[Forward][Backward] 。回想一下,神经网络训练是通过前向-后向传播完成的:
训练示例(批处理)被馈送到网络,前向传递输出当前预测。
根据该预测计算损失。然后导出损失,并使用chain rule估计梯度并向后传播。 .

咖啡 Blob 数据结构
只是快速回顾一下。 Caffe 使用Blob存储数据/权重/参数等的数据结构。对于此讨论,重要的是要注意 Blob有两个“部分”:datadiffBlob 的值存储在data中部分。 diff部分用于存储反向传播步骤的逐元素梯度。

前传

您将看到日志的这一部分中从下到上列出的所有层。对于每一层,您将看到:

I1109 ...]     [Forward] Layer conv1, top blob conv1 data: 0.0645037
I1109 ...]     [Forward] Layer conv1, param blob 0 data: 0.00899114
I1109 ...] [Forward] Layer conv1, param blob 1 data: 0

图层"conv1"是一个具有 2 个参数 blob 的卷积层:滤波器和偏差。因此,日志有三行。过滤器 blob ( param blob 0 ) 有 data

 I1109 ...]     [Forward] Layer conv1, param blob 0 data: 0.00899114

即当前卷积滤波器权重的L2范数为0.00899。
当前偏置( param blob 1 ):

 I1109 ...]     [Forward] Layer conv1, param blob 1 data: 0

表示当前偏差设置为 0。

最后但并非最不重要的一点是,"conv1"层有一个输出,"top"命名"conv1" (多么原始......)。输出的L2范数为

 I1109 ...]     [Forward] Layer conv1, top blob conv1 data: 0.0645037

请注意 [Forward] 的所有 L2 值通过报告data相关 Blob 的一部分。

损失和梯度
结束[Forward]通过损失层:

I1109 ...]     [Forward] Layer loss, top blob loss data: 2031.85
I1109 ...]     [Backward] Layer loss, bottom blob fc1 diff: 0.124506

在此示例中,批量损失为 2031.85,即损失相对于 2031.85 的梯度。 fc1计算并传递给 diff fc1 的一部分 Blob 。梯度的 L2 大小为 0.1245。

向后传递
所有其余层均在本部分中从上到下列出。您可以看到现在报告的 L2 震级为 diff Blob 的一部分(参数和层的输入)。

终于
本次迭代的最后一个日志行:

[Backward] All net params (data, diff): L1 norm = (2711.42, 7086.66); L2 norm = (6.11659, 4085.07)

报告数据和梯度的总 L1 和 L2 大小。

我应该寻找什么?

  1. 如果您有 nan s in your loss ,看看你的数据或差异在什么时候变成 nan : 在哪一层?在哪一次迭代?

  2. 看看梯度大小,它们应该是合理的。如果您开始看到 e+8 的值你的数据/梯度开始爆炸。降低你的学习率!

  3. 请参阅 diff s 不为零。零差异意味着没有梯度=没有更新=没有学习。如果您从随机权重开始,请考虑生成具有更高方差的随机权重。

  4. 寻找趋于零的激活(而不是梯度)。如果您使用 "ReLU" 这意味着您的输入/权重会将您引导至 ReLU 门“未激活”的区域,从而导致 "dead neurons" 。考虑将输入标准化为均值为零,添加 "BatchNorm" 图层,设置negative_slope在 ReLU 中。

关于machine-learning - 如何用debug_info解释caffe日志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40510706/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com