我是参考这位兄弟的文章练习的,只不过我的环境换成了 Ubuntu,
https://www.jianshu.com/p/db8824205fc3
根据这位博主的测试,第一千步就差不多能达到 90%准确率。
step:100 loss:1.5357 accuracy:0.4900
step:200 loss:1.0189 accuracy:0.7000
step:300 loss:0.7720 accuracy:0.7850
step:400 loss:0.6589 accuracy:0.8000
step:500 loss:0.4987 accuracy:0.8300
step:600 loss:0.5863 accuracy:0.8100
step:700 loss:0.5242 accuracy:0.8350
step:800 loss:0.3541 accuracy:0.9000
step:900 loss:0.5004 accuracy:0.8700
step:1000 loss:0.3152 accuracy:0.9050
可是我训练了差不多一百万步,始终在 0.3~0.4 徘徊,不收敛,里面有些大小写的错误我都修正了,还是不得要领。
我的训练结果:
step:100 loss:2.2414 accuracy:0.2250 used time: 3 s
step:200 loss:2.0146 accuracy:0.3450 used time: 7 s
step:300 loss:1.9829 accuracy:0.2900 used time: 11 s
step:400 loss:1.8127 accuracy:0.3350 used time: 15 s
step:500 loss:1.9361 accuracy:0.3150 used time: 19 s
step:600 loss:1.8108 accuracy:0.3300 used time: 23 s
step:700 loss:1.7482 accuracy:0.3950 used time: 27 s
step:800 loss:1.7227 accuracy:0.3200 used time: 31 s
step:900 loss:1.7529 accuracy:0.3500 used time: 35 s
step:1000 loss:1.7124 accuracy:0.3300 used time: 38 s
step:1100 loss:1.7832 accuracy:0.3350 used time: 42 s
step:1200 loss:1.7278 accuracy:0.3500 used time: 46 s
step:1300 loss:1.6402 accuracy:0.3000 used time: 50 s
step:1400 loss:1.6699 accuracy:0.3200 used time: 54 s
step:1500 loss:1.6819 accuracy:0.3600 used time: 59 s
step:1600 loss:1.7417 accuracy:0.3400 used time: 63 s
step:1700 loss:1.7227 accuracy:0.3350 used time: 67 s
step:1800 loss:1.6762 accuracy:0.3850 used time: 71 s
step:1900 loss:1.6828 accuracy:0.3150 used time: 75 s
step:2000 loss:1.6694 accuracy:0.2900 used time: 79 s
step:2100 loss:1.6974 accuracy:0.2950 used time: 83 s
step:2200 loss:1.6517 accuracy:0.3450 used time: 87 s
step:2300 loss:1.6009 accuracy:0.3600 used time: 91 s
step:2400 loss:1.7358 accuracy:0.3300 used time: 95 s
step:2500 loss:1.7149 accuracy:0.3500 used time: 99 s
step:2600 loss:1.6166 accuracy:0.3850 used time: 103 s
step:2700 loss:1.6242 accuracy:0.3500 used time: 107 s
step:2800 loss:1.6648 accuracy:0.3550 used time: 111 s
step:2900 loss:1.6295 accuracy:0.3050 used time: 115 s
step:3000 loss:1.6616 accuracy:0.3400 used time: 119 s
联系了博主,博主表示检查了很久也不知道为什么会这样。而且同一篇文章下也有其它网友说遇到了同样的问题。
请教下各位大神~先谢过了。
1
Machard 2019-01-12 21:49:09 +08:00
有可能是 TensorFlow 版本的问题,记得 1.2 版本之后有很大的差别。
|
2
suley OP @Machard 感谢,我查查看 1.2 版本前后有什么差别;这个代码原理很简单,光从代码上我看不出来版本的差异会有什么影响~
|
3
SorryChen 2019-01-12 22:00:57 +08:00 via iPhone
learning rate 呢?
|
6
SorryChen 2019-01-12 22:07:52 +08:00 via iPhone
@suley 如果你要复现他的结果,你得保证 学习率,预训练模型,参数初始化方法,优化器类型,等等全都一样,才能复现的差不多
|
7
suley OP @SorryChen 问题就是:和博主用一样的代码、一样的参数,但是得不到一样的结果,而且此问题不是我独有,文章下面也有其它人评论有同样的问题,所以很奇怪。
|
8
abcbuzhiming 2019-01-12 22:15:05 +08:00 4
@suley 差 6 个版本说“感觉并无差别”,兄弟你真的是搞计算机的吗?
|
9
Machard 2019-01-12 22:15:20 +08:00
TensorFlow 版本之间的差异。最好保证 TensorFlow 版本一致的情况下进行复现。
|
10
suley OP @abcbuzhiming
都属于 1.x,按理说是这样正常兼容的,除非是 1.x->2.x 这样的跳跃…… 我去查了 1.6~1.12 的 release note,并没有提及版本的不同会导致模型产生那么大的执行差异;如果有,应该会提及吧…… 而且我的是高版本 tf,一般高版本的程序都能向后兼容,这也是常识; tensorflow 的官方 models 也不见得会跟着 tf 的版本升级而更新,但是还是能正常使用。 |
11
iConnect 2019-01-12 22:21:57 +08:00
只看代码难复现你的效果,要从头跑一遍这个训练过程才能知道问题所在,遇到过版本问题,还没遇到过操作系统的问题
|
13
suley OP 我先降级到 1.6 试试……
|
14
geekvcn 2019-01-12 22:24:58 +08:00 via iPhone
脾气倔就不要问问题,自己研究,改下版本不减寿吧?
|
15
iConnect 2019-01-12 22:37:17 +08:00
看了一下代码,没时间从头跑,作者训练的 model 参数都标明了啊,你指的作者没有提供训练好的 model,是指哪个?
你要是降级了还是到不了 90%,我周一用公司的机器跑一下,家里的性能不够比较耗时 |
17
Ediacaran 2019-01-12 22:43:06 +08:00
外行,不过见过有的训练代码是提供随机数种子的
|
18
suley OP @geekvcn 谢谢指教,已经在降级了,看我上一篇回复,但是从头开始处理数据到训练结束估计也要半小时,所以一边讨论,一边跑训练试试;对这个问题比较不解,希望能搞清楚,如果有人知道详细原因更好,这样也能为后来人趟坑~
|
19
jingous 2019-01-12 22:45:52 +08:00
@suley 最直观的就是 tf.contrib 的包,一些计算细节也会更改。具体看官方文档,建议你先更改到 1.6 版本试一试。https://www.tensorflow.org/guide/version_compat
|
20
suley OP @iConnect 我指的是作者没有提供用 Saver 保存好的模型。抱歉可能不太理解你的意思。我是参照作者的代码和参数从头开始处理数据、训练模型的,不知道这算不算“从头跑一遍这个训练过程”?
我正在降级测试~实在不行再麻烦兄弟你帮忙试一下。谢了~ |
21
suley OP @jingous 感谢指教!我也是刚入门,按照固有经验去理解 tf 了,没想到 tf 不走常理,高版本反而不一定兼容低版本;
不过这份代码里 tf.contrib 的包用的不多,keras 处理数据的部分应该没问题(就是简单的做一下 fit_transform ),还有就是调用了 tf.contrib.layers.dropout 方法。 |
22
jingous 2019-01-12 22:59:21 +08:00
@suley tf.contrib 里面得不兼容是指某些包可能在后面的版本中升级为核心包,就不是 tf.contrib.xxx ,而是直接升级为 tf.xx 。如果代码能跑通的话,就不是这个包的问题。你先换成 1.6 版本试一试吧,也不清楚是不是版本的问题。
|
23
iConnect 2019-01-12 23:02:39 +08:00
知道了,你指的是作者没有保存固化 model,就算是你直接下载作者 saved model,tf 版本不同还是会又差别,这个情况我遇到过的,改版本后误差就很小了
|
24
suley OP @iConnect
已经安装了 tf1.6,代码里打印了版本,确定已经启用 1.6 了,但是 试了下,训练结果还是不收敛。搞不懂了。 ``` step:100 loss:2.2723 accuracy:0.2200 used time: 14 s step:200 loss:2.0896 accuracy:0.2800 used time: 29 s step:300 loss:2.1087 accuracy:0.2850 used time: 44 s step:400 loss:1.9824 accuracy:0.2500 used time: 58 s step:500 loss:1.7952 accuracy:0.3250 used time: 73 s step:600 loss:1.8453 accuracy:0.2900 used time: 87 s step:700 loss:1.8526 accuracy:0.2750 used time: 102 s step:800 loss:1.8265 accuracy:0.2900 used time: 117 s step:900 loss:1.7434 accuracy:0.2750 used time: 131 s step:1000 loss:1.8484 accuracy:0.3000 used time: 146 s ``` |
25
minami 2019-01-13 02:21:14 +08:00
如果排除各种情况,还是有这个问题。那说不定是个很蠢的问题 ,没错,就是输入的数据已经错了,代码里打印出来看看
|
26
crazycabbage 2019-01-13 10:03:31 +08:00
数据预处理也要一致
|
27
byteli 2019-01-13 10:11:40 +08:00 via Android
港真,我以前做 dl 的时候,恰好 win 版本出来时也遇到过这个问题,后来就不在 win 下训练了
|
29
suley OP @crazycabbage 谢谢提醒,不过预处理我用的和作者一样的代码,也仔细检查过,应该不是这个问题
|
30
suley OP @byteli 一般我只听说 tf 在 windows 下有问题,没听过 win 正常,linux 不行的……
|
31
abcbuzhiming 2019-01-13 11:04:11 +08:00
@suley 谁告诉你“按理说就应该正常兼容”,这类玩算法的软件小版本大变是非常普遍的现象,不要想当然,去看看腾讯云那个人脸合成的云服务,一个小版本变动整个效果都变了
|
32
suley OP @abcbuzhiming
已经换和作者一样的 1.6 版本试了,还是一样的结果。 腾讯云那个属于具体应用层面了,开发人员换个算法就变了,不具备太大的参考价值; tf 按我理解还是基础设施,如果变动那么大,根本没法做工业应用了。 我仔细看了下 TF 的说明,也提到了同一个 Major Version 下,Public API 和主包里的方法都是向后兼容的, 具体可以查阅: https://www.tensorflow.org/guide/version_compat 所以这不是我自己“想当然”,确实是符合“按理说就应该正常兼容”,只有这几种情况例外: * tf.contrib 包里的内容 * _开头的方法 * 实验性质的方法 然而经过我仔细查阅,基本排除了这个干扰。 |
33
mxalbert1996 2019-01-13 18:39:03 +08:00
很遗憾,tf 的 API 和结果受各种因素影响就是很大的,所以如果真的要在生产环境下使用的话,肯定是不能频繁升级版本的。不同版本,CPU 或 GPU,不同平台(不仅是 tf,CUDA 在不同平台的实现也是不一样的),都会有影响。
|
34
suley OP @mxalbert1996 可惜这次不是这个原因。已经用同版本 tf 试过了
|
35
mxalbert1996 2019-01-13 20:08:36 +08:00
@suley 你能好好读一下我的回复么。。。
|
36
psyche08 2019-01-13 21:00:33 +08:00 via iPhone
试了下,即使是最新版本 tf,我和博主结果是一样的
|
37
suley OP @mxalbert1996
我问了几个 AI 公司的朋友,你这个话不对,有差异是正常的,毕竟每个机器情况不同,但是完全相同的代码,一般的差异只会产生在 CPU 和 GPU 环境,而且差异应该非常小,通常都是 lsb 的区别,精度有差别,结果就有一定的差异,但不应该太大,如果差异很大,一般是代码有 BUG 或者某些方法被 CPU 或者 GPU 忽略,比如 tf.transpose 里的 conjugate 参数在 GPU 上跑的时候会被忽略,导致数据集跑的结果产生差异,只是这种情况已被排除,代码里并无这个问题。TF Minor 版本的影响很小,除了极个别情况,大多数情况下是兼容的,除非是 Major 版本不同。你说的那种只一般只出现在调用了第三方包的情况下,因为第三方的包一般不是官方做的,兼容性测试做的少。我回头让他们帮忙看看代码试试。至少,在我和作者这两种情况下,跑官方 model 结果都差别很小的,也是证明这种情况并不常见,至少不能简单地以一句“版本差异、cpu 差异”等等概括,肯定有深层次的原因。bug 往往就是这种情况下发现的。 |