Tensorflow使用教训:被tf.image.resize浪费的60天
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天相关推荐
- 问题:anaconda 中 tensorflow 与tensorflow-gpu 在tf.image.resize_images()上的区别
工具:pycharm + anaconda 今天在学习<Tensorflow 实战google 深度学习框架>第7章的过程中,在复现 tf.image.resize_images()时发现 ...
- tensorflow的数据读取 tf.data.DataSet、tf.data.Iterator
tensorflow的工程有使用python的多进程读取数据,然后给feed给神经网络进行训练. 也有tensorflow中的 tf.data.DataSet的使用.并且由于是tensorflow框架 ...
- 运行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 ...
- tf.image.resize与skimage的resize
skimage文档是这样说的 skimage.transform.resize( image , output_shape , order=None , mode='reflect' , cval=0 ...
- Tensorflow 十六 用tf.keras函数重写Mnist识别
# coding=utf-8 import os os.environ["TF_CPP_MIN_LOG_LEVEL"]='2' # 只显示 warning 和 Error #### ...
- Tensorflow数据预处理之tf.data.TFRecordDataset---TFRecords详解\TFRecords图像预处理
目录 1.概述 2.预处理数据 2.1.常量定义 2.2.导入库 2.3.从train.txt文件中读取图片-标签对 2.4.预处理图片并保存 2.5.调用main函数 3.读取预处理后的数据 3.1 ...
- tensorflow 无法执行sess =tf .session ()_深度学习|费解的tensorflow
学过Python的小伙伴都会觉得,python的语法简单,逻辑清晰.虽然tensorflow是python的一个库(并不是标准库),但是使用并不简单,你可能会被tensorflow的奇怪语法设计困惑, ...
- Tensorflow之调试(Debug) tf.py_func()
Tensorflow之调试(Debug)及打印变量 tensorflow调试tfdbg 几种常用方法: 1.通过Session.run()获取变量的值 2.利用Tensorboard查看一些可视化统计 ...
- tensorflow随笔-读写数据tf.data
模块:tf.data 定义在tensorflow/_api/v1/data/init.py 输入管道的tf.data.Dataset API 模块 实验模块:构建输入管道的实验API. 类 class ...
最新文章
- 工程打包是什么意思_承包工程是什么意思
- php 计算月,PHP自然月的算法
- 用devc++表白_教你用C语言加图形库打造炫酷表白连连看
- 【渝粤教育】国家开放大学2018年秋季 0267-21T摄影技术 参考试题
- TCP/IP详解 笔记九
- linux c++程序,阐述Linux下C++编程进行学习
- 学以致用一 安装centos7.2虚拟机
- 蓝桥杯 ALGO-88 算法训练 字串统计
- 解决关于phpstorm打开速度很慢的问题
- 牛腩新闻发布--.NET控件FreeTextBox使用方法
- 现代操作系统(原书第4版)英文中文答案
- Could not mount the media/drive ‘D:\......./VBoxGuestAdditions.iso‘ (VERR_PDM_MEDIA_LOCKED)
- java后台对接app微信支付
- SAP S4 OP/Cloud大乱斗(转载)
- 查看 IntelliJ IDEA 符号在插入符号上的定义
- randn函数加噪声_Matlab笔记——AWGN函数详解与实例——AWGN加性高斯白噪声+QPSK调制...
- Python格式化字符 %s %d %f %g实例讲解
- Android读取RAM,ROM,SD卡容量
- 服务器7379如何用u盘装系统,怎么用u盘装系统 用U盘装系统安装过程步骤
- 微信小程序支付V3(Java版)
热门文章
- db2 控制台执行创建函数语句_Python函数定义及调用
- arm 交叉编译找不到so_交叉编译v8时,提示找不到libstdc++.so.6里面GLIBCXX_3.4.20版本的某个符号...
- mysql安全模式什么意思_mysql安全模式指的是什么意思
- python处理二进制文件_使用Python进行二进制文件读写的简单方法(推荐)
- c++ 字符减去‘0’_字符串为什么减‘0’成整数
- 华为鸿蒙何时上线,华为鸿蒙上线在即,国产手机继小米、OPPO之后,魅族也表态了...
- beanstalkd mysql_beanstalkd 安装和配置
- python 差异表达_Python设置差异
- java接口_Java接口
- python变量_Python变量