血泪教训——被Tensorflow偷走的60天
摘要: 血泪教训:tf.image.resize偷走了我60天 警告对象:所有有关视觉内容的Tensorflow使用者 警告内容:别使用tf.image.resize函数
那时,我正在重写我们的神经网络图像升级服务代码库,使之为更大、更快的API和模型做好准备。当我们着手于图像生成(超分辨率、去模糊等)时,我们依赖一个典型的图像处理库,例如OpenCV或PIL。我总会怀疑使用Tensorflow的图像处理功能是否有效。从理论上看,他们应该更快。所以我决定坚持在本地执行Tensorflow图像处理和使用dataset.map构建数据集,以保证所有操作都在我的代码中。
我发现,不仅是我为超分辨率写的新代码不能够再现任何网络新技术,连四个月前写好的代码都不行。更奇怪的是,尽管没有达到预期目标,超分辨率本身的结果有时非常好,网络也正常工作。
调试一下
最初看起来很小的错误导致了60天的奋斗和不眠之夜。我最初错误的想法很简单,我的网络定义或训练过程有问题。数据的预处理非常好,因为我获得了有意义的结果和对图像处理的视觉控制。我调整了所有我能找到的东西,使用Keras、Slim和原始Tensorflow,查找不同版本的Tensorflow和CUDA,以观察变化。我很惭愧地告诉你我最近的怀疑,其中涉及GPU内存和静态的缺陷。我正在调整感知损失和风格损失来寻找原因。每次迭代都需要几天时间来重新训练,才能获得有意义的数据。
昨天我在查看Tensorboard时找到了错误。几乎是潜意识觉得图像出了问题,我忽略了网络输出,并在Photoshop中叠加了目标图像和输入图像,这是我得到的:
这看起来很奇怪,它发生了一些移位。完全违背任何逻辑,这不可能是真的!我的代码很简单。读取图像、裁剪图像、调整图像大小,所有在Tensorflow中。
无论如何,RTFM有一个“角落对齐”参数。你想如何缩小图像尺寸而不是对齐?您可以!所以这个函数有一个存在已久的非常奇怪的行为——阅读这个线程。他们无法修复它,因为这会破坏大量旧代码和预先训练的网络。
该代码实际上将您的图像向左和向上移动一个像素。线程表明,甚至插值在TensorFlow中都会被破坏。这是Tensorflow中实际的缩小结果:
坚持使用Scipy / OpenCV / numpy / PIL,无论你喜欢哪种图像处理。第二个我改变了它,我的网络像魅力一样工作(实际上第二天,我看到了训练结果)。
本文由阿里云云栖社区组织翻译
作者:Oleksandr Savsunenko
译者:Anchor C.,审校:虎说八道