V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
suley
V2EX  ›  TensorFlow

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

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

    我是参考这位兄弟的文章练习的,只不过我的环境换成了 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   ·   实用小工具   ·   1508 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 17:16 · PVG 01:16 · LAX 09:16 · JFK 12:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.