请教: 同一份 Tensorflow 代码,训练新闻自动分类, Windows 和 Linux 下的训练结果不一致?

2019-01-12 21:44:49 +08:00
 suley

我是参考这位兄弟的文章练习的,只不过我的环境换成了 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

联系了博主,博主表示检查了很久也不知道为什么会这样。而且同一篇文章下也有其它网友说遇到了同样的问题。

请教下各位大神~先谢过了。

8863 次点击
所在节点    TensorFlow
39 条回复
suley
2019-01-12 22:54:33 +08:00
@jingous 感谢指教!我也是刚入门,按照固有经验去理解 tf 了,没想到 tf 不走常理,高版本反而不一定兼容低版本;
不过这份代码里 tf.contrib 的包用的不多,keras 处理数据的部分应该没问题(就是简单的做一下 fit_transform ),还有就是调用了 tf.contrib.layers.dropout 方法。
jingous
2019-01-12 22:59:21 +08:00
@suley tf.contrib 里面得不兼容是指某些包可能在后面的版本中升级为核心包,就不是 tf.contrib.xxx ,而是直接升级为 tf.xx 。如果代码能跑通的话,就不是这个包的问题。你先换成 1.6 版本试一试吧,也不清楚是不是版本的问题。
iConnect
2019-01-12 23:02:39 +08:00
知道了,你指的是作者没有保存固化 model,就算是你直接下载作者 saved model,tf 版本不同还是会又差别,这个情况我遇到过的,改版本后误差就很小了
suley
2019-01-13 00:42:20 +08:00
@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
```
minami
2019-01-13 02:21:14 +08:00
如果排除各种情况,还是有这个问题。那说不定是个很蠢的问题 ,没错,就是输入的数据已经错了,代码里打印出来看看
crazycabbage
2019-01-13 10:03:31 +08:00
数据预处理也要一致
byteli
2019-01-13 10:11:40 +08:00
港真,我以前做 dl 的时候,恰好 win 版本出来时也遇到过这个问题,后来就不在 win 下训练了
suley
2019-01-13 10:47:10 +08:00
@minami 我尝试打印了部分预处理前和预处理后的数据,目测,并没看到有什么问题…
suley
2019-01-13 10:48:19 +08:00
@crazycabbage 谢谢提醒,不过预处理我用的和作者一样的代码,也仔细检查过,应该不是这个问题
suley
2019-01-13 10:49:01 +08:00
@byteli 一般我只听说 tf 在 windows 下有问题,没听过 win 正常,linux 不行的……
abcbuzhiming
2019-01-13 11:04:11 +08:00
@suley 谁告诉你“按理说就应该正常兼容”,这类玩算法的软件小版本大变是非常普遍的现象,不要想当然,去看看腾讯云那个人脸合成的云服务,一个小版本变动整个效果都变了
suley
2019-01-13 13:46:26 +08:00
@abcbuzhiming

已经换和作者一样的 1.6 版本试了,还是一样的结果。
腾讯云那个属于具体应用层面了,开发人员换个算法就变了,不具备太大的参考价值; tf 按我理解还是基础设施,如果变动那么大,根本没法做工业应用了。
我仔细看了下 TF 的说明,也提到了同一个 Major Version 下,Public API 和主包里的方法都是向后兼容的,
具体可以查阅:
https://www.tensorflow.org/guide/version_compat
所以这不是我自己“想当然”,确实是符合“按理说就应该正常兼容”,只有这几种情况例外:
* tf.contrib 包里的内容
* _开头的方法
* 实验性质的方法
然而经过我仔细查阅,基本排除了这个干扰。
mxalbert1996
2019-01-13 18:39:03 +08:00
很遗憾,tf 的 API 和结果受各种因素影响就是很大的,所以如果真的要在生产环境下使用的话,肯定是不能频繁升级版本的。不同版本,CPU 或 GPU,不同平台(不仅是 tf,CUDA 在不同平台的实现也是不一样的),都会有影响。
suley
2019-01-13 18:42:00 +08:00
@mxalbert1996 可惜这次不是这个原因。已经用同版本 tf 试过了
mxalbert1996
2019-01-13 20:08:36 +08:00
@suley 你能好好读一下我的回复么。。。
psyche08
2019-01-13 21:00:33 +08:00
试了下,即使是最新版本 tf,我和博主结果是一样的
suley
2019-01-14 11:32:51 +08:00
@mxalbert1996

我问了几个 AI 公司的朋友,你这个话不对,有差异是正常的,毕竟每个机器情况不同,但是完全相同的代码,一般的差异只会产生在 CPU 和 GPU 环境,而且差异应该非常小,通常都是 lsb 的区别,精度有差别,结果就有一定的差异,但不应该太大,如果差异很大,一般是代码有 BUG 或者某些方法被 CPU 或者 GPU 忽略,比如 tf.transpose 里的 conjugate 参数在 GPU 上跑的时候会被忽略,导致数据集跑的结果产生差异,只是这种情况已被排除,代码里并无这个问题。TF Minor 版本的影响很小,除了极个别情况,大多数情况下是兼容的,除非是 Major 版本不同。你说的那种只一般只出现在调用了第三方包的情况下,因为第三方的包一般不是官方做的,兼容性测试做的少。我回头让他们帮忙看看代码试试。至少,在我和作者这两种情况下,跑官方 model 结果都差别很小的,也是证明这种情况并不常见,至少不能简单地以一句“版本差异、cpu 差异”等等概括,肯定有深层次的原因。bug 往往就是这种情况下发现的。
suley
2019-01-14 11:34:15 +08:00
@psyche08 os 是什么环境呢?是 GPU 训练的吗?
psyche08
2019-01-14 13:19:42 +08:00
@suley windows gpu 训练

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/526433

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX