草庐IT

python - 解释张量板图

coder 2023-08-18 原文

我还是新手 tensorflow当我的模型训练继续时,我试图了解正在发生的细节。简而言之,我正在使用 slimImageNet 上预训练的模型做finetuning在我的数据集上。以下是从 tensorboard 中为 2 个独立模型提取的一些图:

Model_1 (InceptionResnet_V2)


Model_2 (InceptionV4)



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

编辑:
正如您在下图中所看到的,权重似乎几乎没有随时间变化。这适用于两个网络的所有其他权重。这让我觉得某处有问题,但不知道如何解释。
InceptionV4 weights


InceptionResnetV2 weights



编辑2:
这些模型首先在 ImageNet 上训练,这些图是在我的数据集上对它们进行微调的结果。我正在使用一个包含 19 个类的数据集,其中包含大约 800000 张图像。我正在做一个多标签分类问题,我使用 sigmoid_crossentropy 作为损失函数。类(class)高度不平衡。在下表中,我们显示了每个类在 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)



编辑 3:
以下是两种模型的损失图:
Losses and regularization loss (InceptionResnet_V2) 


Losses and regularization loss (InceptionV4) 

最佳答案

我同意您的评估 - 小批量中的权重变化不大。看起来他们确实有所改变。

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

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

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

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

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

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

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

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

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

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

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

关于python - 解释张量板图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48012287/

有关python - 解释张量板图的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby - 有人可以帮助解释类创建的 post_initialize 回调吗 (Sandi Metz) - 2

    我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法

  3. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  4. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  5. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  6. python - 如何读取 MIDI 文件、更改其乐器并将其写回? - 2

    我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的

  7. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  8. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

  9. Python 刷Leetcode题库,顺带学英语单词(31) - 2

    ValidPalindromeGivenastring,determineifitisapalindrome,consideringonlyalphanumericcharactersandignoringcases. [#125]Example:"Aman,aplan,acanal:Panama"isapalindrome."raceacar"isnotapalindrome.Haveyouconsiderthatthestringmightbeempty?Thisisagoodquestiontoaskduringaninterview.Forthepurposeofthisproblem

  10. python - 是否可以使用 Ruby 或 Python 禁用 anchor /引用来发出有效的 YAML? - 2

    是否可以在PyYAML或Ruby的Psych引擎中禁用创建anchor和引用(并有效地显式列出冗余数据)?也许我在网上搜索时遗漏了一些东西,但在Psych中似乎没有太多可用的选项,而且我也无法确定PyYAML是否允许这样做.基本原理是我必须序列化一些数据并将其以可读的形式传递给一个不是真正的技术同事进行手动验证。有些数据是多余的,但我需要以最明确的方式列出它们以提高可读性(anchor和引用是提高效率的好概念,但不是人类可读性)。Ruby和Python是我选择的工具,但如果有其他一些相当简单的方法来“展开”YAML文档,它可能就可以了。 最佳答案

随机推荐