模型和训练参数,数据预处理方式都是相同的,但是PyTorch的实现相对TF实现低了十几个点,排查了很久都没有找到原因,请大家帮帮忙,非常感谢!

project:

Tramac/awesome-semantic-segmentation-pytorch?

github.com图标


不同框架间怎么做到严格对齐(不仅仅是loss曲线长的差不多,而是保证一样的输入一样的输出)是一个极其挑战和辛苦的事,框架内部的变化太多了,有些小trick 是靠海量用户量积累起来的。这也是我们在研发oneflow过程中克服的一个挑战之一,我们做到了和tensorflow 严格对齐,个中滋味只有尝过才能理解,我同事近期会写一篇文章,总结出来对齐过程各种稀奇古怪的坑。

r=x+y+z

r=x+z+y

结果不一样,在迭代多次以后就差别很大了。


十几个点肯定是自己的原因。


不知道你网路用了哪些层, 这怎么说

  1. 初始化有影响——主要是对比时, 使用相对的初始化更好对比, 最终结果也可能有差别
  2. 优化器选择、学习率、learning rate scheduler, 不过这个应该是最不可能不一样的, 这用得不一样, 只能说是粗心了, 没错, 我时不时来一下。。。
  3. batchnorm 和 dropout 参数, dropout 层我没研究清楚, batchnorm 的话, 从调试来看, pytorch的 batchnorm 要把 affine=False, 输出才能和tensorflow 相同, affine=True 会不一样
  4. 数据预处理方式相同, 但, 顺序有时候也有点影响, 换个 seed 都能有不小的区别, 所以更难说得清楚了, 除非你用相同的代码读数据——但静态的tf 和 pytorch 可能又不那么好兼容
  5. 忘了。。。

我在我的 sndnyang/DeepLearningCMP里有 notebook, tf_eager.ipynb 和 pytorch.ipynb 两个文件, 对比了下。。。不过可能有遗漏。


十几……这锅工具不好背啊


可以把tensorflow模型转化为pytorch版本,列印输出,一层层排查,注意每一层的参数,尤其是bn层。


看看数据训练前有没有打散(tf和pytorch是不是一样), 权重参数初始化的方法是不是一样,优化器学习率等是不是一样, 如果这些条件都满足, 那结果应该相差不大。


我也遇到过 感觉是bn层有问题


有兴趣可以看下c代码层面的优化,之前我也碰到过,一样的参数一样的初始化,tf的性能确实优于pytorch


要看看默认的初始化,API中的默认参数是不是一样的,不然影响会挺大的


这就是神经网路,因为神经


同样的模型与参数, tensorflow实现的性能比pytorch低了很多。我认为这也可能存在,取决于模型与参数吧。毕竟两个框架底层有多少不同讲不清楚


手写图像分割模型,在tensorflow上效果很好,在pytorch上很差。后来发现是损失函数的参数问题,tensorflow中自己写的多分类focal loss用作分割任务(alpha用0.25),pytorch中重写了该函数(但是alpha要用1.5至1.75才有效果),有点懵。


推荐阅读:
相关文章