请教: 同一份 Tensorflow 代码,训练新闻自动分类, Windows 和 Linux 下的训练结果不一致? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
suley
V2EX    TensorFlow

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

  •  
  •   suley 2019-01-12 21:44:49 +08:00 9429 次点击
    这是一个创建于 2528 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    39 条回复    2019-01-14 13:19:42 +08:00
    Machard
        1
    Machard  
       2019-01-12 21:49:09 +08:00
    有可能是 TensorFlow 版本的问题,记得 1.2 版本之后有很大的差别。
    suley
        2
    suley  
    OP
       2019-01-12 21:52:29 +08:00
    @Machard 感谢,我查查看 1.2 版本前后有什么差别;这个代码原理很简单,光从代码上我看不出来版本的差异会有什么影响~
    SorryChen
        3
    SorryChen  
       2019-01-12 22:00:57 +08:00 via iPhone
    learning rate 呢?
    suley
        4
    suley  
    OP
       2019-01-12 22:02:06 +08:00
    @Machard 看了下这个博主和我的版本,他是 1.6,我是 1.12 ,感觉并无差别
    suley
        5
    suley  
    OP
       2019-01-12 22:05:04 +08:00
    @SorryChen 学习率是 1e-3,我设置大点试试,谢谢~
    SorryChen
        6
    SorryChen  
       2019-01-12 22:07:52 +08:00 via iPhone
    @suley 如果你要复现他的结果,你得保证 学习率,预训练模型,参数初始化方法,优化器类型,等等全都一样,才能复现的差不多
    suley
        7
    suley  
    OP
       2019-01-12 22:12:34 +08:00
    @SorryChen 问题就是:和博主用一样的代码、一样的参数,但是得不到一样的结果,而且此问题不是我独有,文章下面也有其它人评论有同样的问题,所以很奇怪。
    abcbuzhiming
        8
    abcbuzhiming  
       2019-01-12 22:15:05 +08:00   4
    @suley 差 6 个版本说“感觉并无差别”,兄弟你真的是搞计算机的吗?
    Machard
        9
    Machard  
       2019-01-12 22:15:20 +08:00
    TensorFlow 版本之间的差异。最好保证 TensorFlow 版本一致的情况下进行复现。
    suley
        10
    suley  
    OP
       2019-01-12 22:21:11 +08:00
    @abcbuzhiming

    都属于 1.x,按理说是这样正常兼容的,除非是 1.x->2.x 这样的跳跃……

    我去查了 1.6~1.12 的 release note,并没有提及版本的不同会导致模型产生那么大的执行差异;如果有,应该会提及吧……

    而且我的是高版本 tf,一般高版本的程序都能向后兼容,这也是常识; tensorflow 的官方 models 也不见得会跟着 tf 的版本升级而更新,但是还是能正常使用。
    iConnect
        11
    iConnect  
       2019-01-12 22:21:57 +08:00
    只看代码难复现你的效果,要从头跑一遍这个训练过程才能知道问题所在,遇到过版本问题,还没遇到过操作系统的问题
    suley
        12
    suley  
    OP
       2019-01-12 22:23:51 +08:00
    @iConnect 已经是从头开始跑了,作者也没提供训练好的 model 啊……
    suley
        13
    suley  
    OP
       2019-01-12 22:24:42 +08:00
    我先降级到 1.6 试试……
    geekvcn
        14
    geekvcn  
       2019-01-12 22:24:58 +08:00 via iPhone
    脾气倔就不要问问题,自己研究,改下版本不减寿吧?
    iConnect
        15
    iConnect  
       2019-01-12 22:37:17 +08:00
    看了一下代码,没时间从头跑,作者训练的 model 参数都标明了啊,你指的作者没有提供训练好的 model,是指哪个?

    你要是降级了还是到不了 90%,我周一用公司的机器跑一下,家里的性能不够比较耗时
    jingous
        16
    jingous  
       2019-01-12 22:39:58 +08:00 via Android
    @suley tensorflow 高版本不一定兼容低版本
    Ediacaran
        17
    Ediacaran  
       2019-01-12 22:43:06 +08:00
    外行,不过见过有的训练代码是提供随机数种子的
    suley
        18
    suley  
    OP
       2019-01-12 22:45:06 +08:00
    @geekvcn 谢谢指教,已经在降级了,看我上一篇回复,但是从头开始处理数据到训练结束估计也要半小时,所以一边讨论,一边跑训练试试;对这个问题比较不解,希望能搞清楚,如果有人知道详细原因更好,这样也能为后来人趟坑~
    jingous
        19
    jingous  
       2019-01-12 22:45:52 +08:00
    @suley 最直观的就是 tf.contrib 的包,一些计算细节也会更改。具体看官方文档,建议你先更改到 1.6 版本试一试。https://www.tensorflow.org/guide/version_compat
    suley
        20
    suley  
    OP
       2019-01-12 22:50:14 +08:00
    @iConnect 我指的是作者没有提供用 Saver 保存好的模型。抱歉可能不太理解你的意思。我是参照作者的代码和参数从头开始处理数据、训练模型的,不知道这算不算“从头跑一遍这个训练过程”?
    我正在降级测试~实在不行再麻烦兄弟你帮忙试一下。谢了~
    suley
        21
    suley  
    OP
       2019-01-12 22:54:33 +08:00
    @jingous 感谢指教!我也是刚入门,按照固有经验去理解 tf 了,没想到 tf 不走常理,高版本反而不一定兼容低版本;
    不过这份代码里 tf.contrib 的包用的不多,keras 处理数据的部分应该没问题(就是简单的做一下 fit_transform ),还有就是调用了 tf.contrib.layers.dropout 方法。
    jingous
        22
    jingous  
       2019-01-12 22:59:21 +08:00
    @suley tf.contrib 里面得不兼容是指某些包可能在后面的版本中升级为核心包,就不是 tf.contrib.xxx ,而是直接升级为 tf.xx 。如果代码能跑通的话,就不是这个包的问题。你先换成 1.6 版本试一试吧,也不清楚是不是版本的问题。
    iConnect
        23
    iConnect  
       2019-01-12 23:02:39 +08:00
    知道了,你指的是作者没有保存固化 model,就算是你直接下载作者 saved model,tf 版本不同还是会又差别,这个情况我遇到过的,改版本后误差就很小了
    suley
        24
    suley  
    OP
       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
        25
    minami  
       2019-01-13 02:21:14 +08:00
    如果排除各种情况,还是有这个问题。那说不定是个很蠢的问题 ,没错,就是输入的数据已经错了,代码里打印出来看看
    crazycabbage
        26
    crazycabbage  
       2019-01-13 10:03:31 +08:00
    数据预处理也要一致
    byteli
        27
    byteli  
       2019-01-13 10:11:40 +08:00 via Android
    港真,我以前做 dl 的时候,恰好 win 版本出来时也遇到过这个问题,后来就不在 win 下训练了
    suley
        28
    suley  
    OP
       2019-01-13 10:47:10 +08:00 via Android
    @minami 我尝试打印了部分预处理前和预处理后的数据,目测,并没看到有什么问题…
    suley
        29
    suley  
    OP
       2019-01-13 10:48:19 +08:00 via Android
    @crazycabbage 谢谢提醒,不过预处理我用的和作者一样的代码,也仔细检查过,应该不是这个问题
    suley
        30
    suley  
    OP
       2019-01-13 10:49:01 +08:00 via Android
    @byteli 一般我只听说 tf 在 windows 下有问题,没听过 win 正常,linux 不行的……
    abcbuzhiming
        31
    abcbuzhiming  
       2019-01-13 11:04:11 +08:00
    @suley 谁告诉你“按理说就应该正常兼容”,这类玩算法的软件小版本大变是非常普遍的现象,不要想当然,去看看腾讯云那个人脸合成的云服务,一个小版本变动整个效果都变了
    suley
        32
    suley  
    OP
       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
        33
    mxalbert1996  
       2019-01-13 18:39:03 +08:00
    很遗憾,tf 的 API 和结果受各种因素影响就是很大的,所以如果真的要在生产环境下使用的话,肯定是不能频繁升级版本的。不同版本,CPU 或 GPU,不同平台(不仅是 tf,CUDA 在不同平台的实现也是不一样的),都会有影响。
    suley
        34
    suley  
    OP
       2019-01-13 18:42:00 +08:00
    @mxalbert1996 可惜这次不是这个原因。已经用同版本 tf 试过了
    mxalbert1996
        35
    mxalbert1996  
       2019-01-13 20:08:36 +08:00
    @suley 你能好好读一下我的回复么。。。
    psyche08
        36
    psyche08  
       2019-01-13 21:00:33 +08:00 via iPhone
    试了下,即使是最新版本 tf,我和博主结果是一样的
    suley
        37
    suley  
    OP
       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
        38
    suley  
    OP
       2019-01-14 11:34:15 +08:00
    @psyche08 os 是什么环境呢?是 GPU 训练的吗?
    psyche08
        39
    psyche08  
       2019-01-14 13:19:42 +08:00
    @suley windows gpu 训练
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3119 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 11:28 PVG 19:28 LAX 03:28 JFK 06:28
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86