- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我还是新手 tensorflow
当我的模型训练继续时,我试图了解正在发生的细节。简而言之,我正在使用 slim
在 ImageNet
上预训练的模型做finetuning
在我的数据集上。以下是从 tensorboard 中为 2 个独立模型提取的一些图:
Model_1 (InceptionResnet_V2)
Model_2 (InceptionV4)
Model_1
的平均 Az(ROC 曲线下的面积)= 0.7,
Model_2
的平均值为 0.79)。我对这些图的解释是权重在小批量中没有变化。只有偏差会随着小批量而改变,这可能是问题所在。但我不知道去哪里验证这一点。这是我能想到的唯一解释,但考虑到我仍然是新手,这可能是错误的。你能和我分享你的想法吗?如有需要,请不要犹豫,索取更多地块。
InceptionV4 weights
InceptionResnetV2 weights
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)
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-4
至 1e-8
工作得很好。
关于python - 解释张量板图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48012287/
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!