13

我还是新手,tensorflow我正试图了解在我的模型训练进行时发生的细节。简而言之,我正在使用经过预训练的slim模型对ImageNetfinetuning的数据集进行处理。以下是从 tensorboard 中提取的 2 个独立模型的一些图:

Model_1 (InceptionResnet_V2)

初始 resnet V2

Model_2 (InceptionV4)

盗梦空间V4

到目前为止,这两个模型在验证集上的结果都很差(平均 Az(ROC 曲线下的面积)= 0.7Model_1和 0.79 Model_2)。我对这些图的解释是,小批量的权重没有变化。只是小批量的偏差会发生变化,这可能是问题所在。但我不知道在哪里可以验证这一点。这是我能想到的唯一解释,但考虑到我仍然是新手,这可能是错误的。你能和我分享你的想法吗?如果需要,请毫不犹豫地要求更多地块。

编辑: 正如您在下面的图中看到的那样,权重似乎几乎没有随着时间的推移而变化。这适用于两个网络的所有其他权重。这使我认为某处存在问题,但不知道如何解释。

InceptionV4 weights

InceptionV4 权重

InceptionResnetV2 weights

InceptionResnetV2 权重

EDIT2: 这些模型首先在 ImageNet 上训练,这些图是在我的数据集上微调它们的结果。我正在使用一个包含 19 个类的数据集,其中包含大约 800000 张图像。我正在做一个多标签分类问题,我使用 sigmoid_crossentropy 作为损失函数。班级高度不平衡。在下表中,我们显示了 2 个子集(训练、验证)中每个类的存在百分比:

Objects     train       validation
obj_1       3.9832 %    0.0000 %
obj_2       70.6678 %   33.3253 %
obj_3       89.9084 %   98.5371 %
obj_4       85.6781 %   81.4631 %
obj_5       92.7638 %   71.4327 %
obj_6       99.9690 %   100.0000 %
obj_7       90.5899 %   96.1605 %
obj_8       77.1223 %   91.8368 %
obj_9       94.6200 %   98.8323 %
obj_10      88.2051 %   95.0989 %
obj_11      3.8838 %    9.3670 %
obj_12      50.0131 %   24.8709 %
obj_13      0.0056 %    0.0000 %
obj_14      0.3237 %    0.0000 %
obj_15      61.3438 %   94.1573 %
obj_16      93.8729 %   98.1648 %
obj_17      93.8731 %   97.5094 %
obj_18      59.2404 %   70.1059 %
obj_19      8.5414 %    26.8762 %

超参数的值:

batch_size=32
weight_decay = 0.00004 #'The weight decay on the model weights.'
optimizer = rmsprop
rmsprop_momentum = 0.9 
rmsprop_decay = 0.9 #'Decay term for RMSProp.'

learning_rate_decay_type =  exponential #Specifies how the learning rate is decayed
learning_rate =  0.01 #Initial learning rate.
learning_rate_decay_factor = 0.94 #Learning rate decay factor
num_epochs_per_decay = 2.0 #'Number of epochs after which learning rate

关于层的稀疏性,以下是两个网络的层稀疏性的一些示例:

sparsity (InceptionResnet_V2) 

在此处输入图像描述

sparsity (InceptionV4)

在此处输入图像描述

EDITED3:这是两个模型的损失图:

Losses and regularization loss (InceptionResnet_V2) 

在此处输入图像描述

Losses and regularization loss (InceptionV4) 

在此处输入图像描述

4

1 回答 1

9

我同意你的评估——小批量的权重变化不大。看来他们正在发生一些变化。

我相信您知道,您正在对非常大的模型进行微调。因此,反向传播有时可能需要一段时间。但是,您正在运行许多训练迭代。我真的不认为这是问题所在。

如果我没记错的话,这两个最初都是在 ImageNet 上训练的。如果您的图像与 ImageNet 中的图像位于完全不同的域中,则可以解释问题。

反向传播方程确实使偏差更容易随着某些激活范围而改变。如果模型高度稀疏(即如果许多层的激活值为 0,那么权重将难以调整但偏差不会),则 ReLU 可以是其中之一。此外,如果激活在范围内[0, 1],则权重的梯度将高于偏差的梯度。(这就是为什么 sigmoid 是一个不好的激活函数)。

它也可能与您的读出层有关 - 特别是激活功能。你是如何计算误差的?这是分类问题还是回归问题?如果可能的话,我建议使用 sigmoid 以外的其他东西作为最终激活函数。tanh可能会稍微好一些。线性读出有时也会加快训练速度(所有梯度都必须“通过”读出层。如果读出层的导数始终为 1 - 线性 - 你“让更多梯度通过”以进一步调整权重该模型)。

最后,我注意到您的权重直方图正在向负权重推进。有时,特别是对于具有大量 ReLU 激活的模型,这可能是模型学习稀疏性的一个指标。或死亡神经元问题的指标。或者两者兼而有之——两者有些联系。

最终,我认为你的模型只是在努力学习。我在重新训练 Inception 时遇到了非常相似的直方图。我正在使用一个包含大约 2000 张图像的数据集,并且努力将其精度提高到 80% 以上(碰巧,该数据集存在严重偏差——该准确度大致与随机猜测一样好)。当我使卷积变量保持不变并且只对全连接层进行更改时,它会有所帮助。


事实上,这是一个分类问题,sigmoid 交叉熵是合适的激活函数。而且你确实有一个相当大的数据集——当然大到足以微调这些模型。

有了这些新信息,我建议降低初始学习率。我在这里有两个理由:

(1) 是我自己的经验。正如我所提到的,我对 RMSprop 并不是特别熟悉。我只在 DNC 的上下文中使用过它(尽管是带有卷积控制器的 DNC),但我在那里的经验支持了我要说的内容。我认为.01从头开始训练模型是很高的,更不用说微调了。这对亚当来说肯定很高。从某种意义上说,从一个小的学习率开始是微调的“精细”部分。不要强迫重物移动太多。特别是如果您正在调整整个模型而不是最后(几个)层。

(2) 是越来越稀疏并转向负权重。根据您的稀疏图(顺便说一句好主意),在我看来,由于过度校正,某些权重可能会卡在稀疏配置中。即,由于初始速率较高,权重“超出”了它们的最佳位置并卡在某个地方,这使得它们难以恢复并为模型做出贡献。也就是说,在 ReLU 网络中,稍微负数和接近于零是不好的。

正如我(反复)提到的,我对 RMSprop 不是很熟悉。但是,由于您已经运行了大量的训练迭代,因此尝试低、低、初始速率并逐步提高。我的意思是,看看如何1e-8工作。该模型可能不会以如此低的速率响应训练,而是使用学习速率进行一些非正式的超参数搜索。根据我使用 Adam 的 Inception 经验,1e-4效果1e-8很好。

于 2017-12-30T19:16:13.417 回答