How Tensorflow’s tf.image.resize stole 60 days of my life

原文地址:https://hackernoon.com/how-tensorflows-tf-image-resize-stole-60-days-of-my-life-aba5eb093f35?gi=f6c680bed9e0

这是一个对所有计算机视觉工作者的简短警告:请勿使用任何tf.image.resize函数!

为了让增强图像识别的神经网络,使其更快,更大,并为正在开发的API做好准备,我正在重写这一部分的代码库,如同我们以前处理图像生成任务(超分辨率,去模糊等)时,我们确实依赖OpenCv和PIL这样的典型图像处理库。我总是怀疑使用TensorFlow图像处理功能是否合理——理论上来说,它们应该更快。因此,我决定坚持使用dataset.map()函数,将所有的图像处理的运算放入其中。

问题出现了——我的新代码训练出来的超分辨率模型不仅没法state-of-art,甚至还不如我4个月前写的。而最丑陋的部分是,超分辨率本身的结果有时是非常好的,说明网络是working的,尽管没有达到PSNR目标,有时候还有一些奇怪的视觉产物,比如小线条的倍增。

让我们开始debug

我为这个看起来很小的bug奋斗了60天。我的逻辑很简单--网络结构的定义或者训练过程中出现了问题,数据处理绝对没有问题,因为我在Tensorboard中可视化了图像处理过程与结果。

我调整了我能想到的所有东西,使用Keras,Slim,用原生TensorFlow——没有什么卵用。切换TF1.3→1.4→1.5和不同的CUDA版本。我甚至怀疑GPU内存和静态的缺陷。我甚至调整perceptual losses和style losses来寻找原因。每次训练都需要花几天时间才能获得有意义的结果。

就在昨天,我查看Tensorboard的时候发现了bug。几乎是潜意识里觉得图像出了问题。我直接忽略网络的输出,在Photoshop中叠加了目标图像和输入图像(即缩小的目标图像),下图是我得到的:

这看起来很奇怪,两张图像之间发生了位移,完全违背任何逻辑,这是不可能的! 我的代码其实很简单,读取图像,裁剪图像,调整图像大小,所有操作都在TensorFlow中执行。

无论如何,Read The Fucking Manual ,tf.image.resize_bicubic有一个参数——“对齐角落”。这个有着奇怪行为的函数已经存在了很长时间了,他们无法修复他,因为这会破坏大量旧代码和预先训练的网络

我们的tf.image.resize_area函数甚至不等于反射,虽然可以优雅地解决这个问题,但我会担心会破坏旧的模式。

该代码实际将你的图像向左和向上移动一个像素,这个破坏过程甚至在插值中。这是2018年,很难想象这是TensorFlow对缩小尺度的结果。

无论你偏好什么样的图像处理过程,坚持使用Scipy/OpenCV/numpy/PIL。当我改变了这部分代码,我的网络焕发出了魅力(当我看到训练结果时,实际上是第二天)。

Tensorflow使用教训:被tf.image.resize浪费的60天相关推荐

  1. 问题:anaconda 中 tensorflow 与tensorflow-gpu 在tf.image.resize_images()上的区别

    工具:pycharm + anaconda 今天在学习<Tensorflow 实战google 深度学习框架>第7章的过程中,在复现 tf.image.resize_images()时发现 ...

  2. tensorflow的数据读取 tf.data.DataSet、tf.data.Iterator

    tensorflow的工程有使用python的多进程读取数据,然后给feed给神经网络进行训练. 也有tensorflow中的 tf.data.DataSet的使用.并且由于是tensorflow框架 ...

  3. 运行tensorflow-datasets遇到import tensorflow.compat.v2 as tf报错ImportError: No module named tensorflow.V2

    运行tensorflow-datasets遇到import tensorflow.compat.v2 as tf报错ImportError: No module named tensorflow.V2 ...

  4. tf.image.resize与skimage的resize

    skimage文档是这样说的 skimage.transform.resize( image , output_shape , order=None , mode='reflect' , cval=0 ...

  5. Tensorflow 十六 用tf.keras函数重写Mnist识别

    # coding=utf-8 import os os.environ["TF_CPP_MIN_LOG_LEVEL"]='2' # 只显示 warning 和 Error #### ...

  6. Tensorflow数据预处理之tf.data.TFRecordDataset---TFRecords详解\TFRecords图像预处理

    目录 1.概述 2.预处理数据 2.1.常量定义 2.2.导入库 2.3.从train.txt文件中读取图片-标签对 2.4.预处理图片并保存 2.5.调用main函数 3.读取预处理后的数据 3.1 ...

  7. tensorflow 无法执行sess =tf .session ()_深度学习|费解的tensorflow

    学过Python的小伙伴都会觉得,python的语法简单,逻辑清晰.虽然tensorflow是python的一个库(并不是标准库),但是使用并不简单,你可能会被tensorflow的奇怪语法设计困惑, ...

  8. Tensorflow之调试(Debug) tf.py_func()

    Tensorflow之调试(Debug)及打印变量 tensorflow调试tfdbg 几种常用方法: 1.通过Session.run()获取变量的值 2.利用Tensorboard查看一些可视化统计 ...

  9. tensorflow随笔-读写数据tf.data

    模块:tf.data 定义在tensorflow/_api/v1/data/init.py 输入管道的tf.data.Dataset API 模块 实验模块:构建输入管道的实验API. 类 class ...

最新文章

  1. 工程打包是什么意思_承包工程是什么意思
  2. php 计算月,PHP自然月的算法
  3. 用devc++表白_教你用C语言加图形库打造炫酷表白连连看
  4. 【渝粤教育】国家开放大学2018年秋季 0267-21T摄影技术 参考试题
  5. TCP/IP详解 笔记九
  6. linux c++程序,阐述Linux下C++编程进行学习
  7. 学以致用一 安装centos7.2虚拟机
  8. 蓝桥杯 ALGO-88 算法训练 字串统计
  9. 解决关于phpstorm打开速度很慢的问题
  10. 牛腩新闻发布--.NET控件FreeTextBox使用方法
  11. 现代操作系统(原书第4版)英文中文答案
  12. Could not mount the media/drive ‘D:\......./VBoxGuestAdditions.iso‘ (VERR_PDM_MEDIA_LOCKED)
  13. java后台对接app微信支付
  14. SAP S4 OP/Cloud大乱斗(转载)
  15. 查看 IntelliJ IDEA 符号在插入符号上的定义
  16. randn函数加噪声_Matlab笔记——AWGN函数详解与实例——AWGN加性高斯白噪声+QPSK调制...
  17. Python格式化字符 %s %d %f %g实例讲解
  18. Android读取RAM,ROM,SD卡容量
  19. 服务器7379如何用u盘装系统,怎么用u盘装系统 用U盘装系统安装过程步骤
  20. 微信小程序支付V3(Java版)

热门文章

  1. db2 控制台执行创建函数语句_Python函数定义及调用
  2. arm 交叉编译找不到so_交叉编译v8时,提示找不到libstdc++.so.6里面GLIBCXX_3.4.20版本的某个符号...
  3. mysql安全模式什么意思_mysql安全模式指的是什么意思
  4. python处理二进制文件_使用Python进行二进制文件读写的简单方法(推荐)
  5. c++ 字符减去‘0’_字符串为什么减‘0’成整数
  6. 华为鸿蒙何时上线,华为鸿蒙上线在即,国产手机继小米、OPPO之后,魅族也表态了...
  7. beanstalkd mysql_beanstalkd 安装和配置
  8. python 差异表达_Python设置差异
  9. java接口_Java接口
  10. python变量_Python变量