血泪教训——被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中叠加了目标图像和输入图像,这是我得到的:
__20180410144324

这看起来很奇怪,它发生了一些移位。完全违背任何逻辑,这不可能是真的!我的代码很简单。读取图像、裁剪图像、调整图像大小,所有在Tensorflow中。
无论如何,RTFM有一个“角落对齐”参数。你想如何缩小图像尺寸而不是对齐?您可以!所以这个函数有一个存在已久的非常奇怪的行为——阅读这个线程。他们无法修复它,因为这会破坏大量旧代码和预先训练的网络。
该代码实际上将您的图像向左和向上移动一个像素。线程表明,甚至插值在TensorFlow中都会被破坏。这是Tensorflow中实际的缩小结果:
__20180410144341

坚持使用Scipy / OpenCV / numpy / PIL,无论你喜欢哪种图像处理。第二个我改变了它,我的网络像魅力一样工作(实际上第二天,我看到了训练结果)。
数十款阿里云产品限时折扣中,赶紧点击领劵开始云上实践吧!
本文由阿里云云栖社区组织翻译
作者:Oleksandr Savsunenko
译者:Anchor C.,审校:虎说八道
文章为简译,更为详细的内容,请查看原文文章

相关文章
|
1月前
|
机器学习/深度学习 算法框架/工具 开发者
《当Keras遇上复杂模型:探寻其潜藏的局限》
Keras以其简洁易用的特点成为深度学习入门者的首选工具,但构建复杂模型时其局限性逐渐显现。首先,在表达复杂网络结构(如多分支、多模态融合)时灵活性不足;其次,动态网络结构调整支持较弱,难以满足实时变化的需求。此外,性能瓶颈问题突出,包括运行速度慢和GPU内存占用高,影响大规模模型训练效率。调试方面,过度封装使错误排查困难,自定义层和集成其他工具也面临挑战。尽管如此,Keras仍在快速原型开发中占据重要地位,未来需通过改进以适应更复杂的深度学习需求。
47 13
|
5月前
|
机器学习/深度学习 自然语言处理 PyTorch
深入调查研究PyTorch
【10月更文挑战第26天】
72 0
|
8月前
|
JSON C# 开发者
💡探索C#语言进化论:揭秘.NET开发效率飙升的秘密武器💼
【8月更文挑战第28天】C#语言凭借其强大的功能与易用性深受开发者喜爱。伴随.NET平台演进,C#持续引入新特性,如C# 7.0的模式匹配,让处理复杂数据结构更直观简洁;C# 8.0的异步流则使异步编程更灵活高效,无需一次性加载全部数据至内存。通过示例展示了模式匹配简化JSON解析及异步流实现文件逐行读取的应用。此外,C# 8.0还提供了默认接口成员和可空引用类型等特性,进一步提高.NET开发效率与代码可维护性。随着C#的发展,未来的.NET开发将更加高效便捷。
94 1
|
9月前
|
算法 大数据 数据处理
震撼!Python堆与优先队列的神奇力量,让你的数据处理能力瞬间爆表!
【7月更文挑战第9天】Python的heapq模块实现了堆数据结构,用于高效地插入、删除和查找最大/最小元素。在Top K元素查找中,堆能快速找到大数据集的前k个最大值。同样,堆作为优先队列,按优先级而非入队顺序处理任务,如任务调度,展示其在复杂问题解决中的效率。掌握这些工具,能显著提升数据处理和编程效率。
66 3
|
11月前
|
机器学习/深度学习 算法 前端开发
2024年8个可以提高数据科学工作效率并节省宝贵时间的Python库,2024年最新记得把每一次面试当做经验积累
2024年8个可以提高数据科学工作效率并节省宝贵时间的Python库,2024年最新记得把每一次面试当做经验积累
2024年8个可以提高数据科学工作效率并节省宝贵时间的Python库,2024年最新记得把每一次面试当做经验积累
|
存储 程序员 虚拟化
程序员必备的软技能- CPU“没有灵魂的躯体”
程序员必备的软技能- CPU“没有灵魂的躯体”
126 0
|
存储 数据可视化 PyTorch
学懂 ONNX,PyTorch 模型部署再也不怕!
在把 PyTorch 模型转换成 ONNX 模型时,我们往往只需要轻松地调用一句 torch.onnx.export 就行了。这个函数的接口看上去简单,但它在使用上还有着诸多的“潜规则”。在这篇教程中,我们会详细介绍 PyTorch 模型转 ONNX 模型的原理及注意事项。除此之外,我们还会介绍 PyTorch 与 ONNX 的算子对应关系,以教会大家如何处理 PyTorch 模型转换时可能会遇到的算子支持问题。
4509 0
|
存储 SQL 数据挖掘
还在抱怨pandas运行速度慢?这几个方法会颠覆你的看法
还在抱怨pandas运行速度慢?这几个方法会颠覆你的看法
1123 0
还在抱怨pandas运行速度慢?这几个方法会颠覆你的看法
|
安全 数据处理 索引
Python 告诉你疫情扩散有多可怕
Python 告诉你疫情扩散有多可怕
189 0