问题描述

最近在训练卷积神经网络(CNN)时,只要使用逆卷积层(PyTorch中为ConvTranspose2d)进行上采样,输出图像中总会出现如下图所示的马赛克纹理,而且异常明显:

分析

虽然Deconvolution and Checkerboard Artifacts这篇文章中提到了这种马赛克纹理(文中称之为checkerboard artifact)是逆卷积层的固有问题,但是上图中的马赛克比文中给出的示例图像明显太多,使用逆卷积层是CNN中上采样的经典手段,不太可能出现如此巨大的artifact。经过反复检查代码,发现网络的实现并没有问题,马赛克确实是由逆卷积层引起的,即如果将ConvTranspose2d替换成线性插值上采样,马赛克就会消失:

反复调试无果后请教了有经验的高手,给出的结论是网络没训好……
把学习率调高10倍,再多训几十个epoch,就得到了如下结果:

马赛克问题基本消除,这个效果就和文章Deconvolution and Checkerboard Artifacts中的示例图片比较接近了。

解决方法

所以解决这个问题,需要看一下训练曲线是否收敛,如果没有,那么把网络再训练得收敛一些就会大大改善。还有一个缓解的办法是在最后一层ConvTranspose2d之后接一个卷积层(Conv2d),可以带来一点平滑的效果。

思考

从上图的效果可以看到,在图像中不平坦的区域仍然有马赛克网格,这是ConvTranspose2d的固有问题。按照我的理解,由于逆卷积层在做上采样时需要先将原始张量resize再做卷积,而resize时的策略是向已有像素之间补0,这样就会导致在卷积操作之前输入的是一个马赛克极其严重的张量,卷积核本身难以对这样的输入做到很好地平滑。特别是当网络未经训练或者未训练收敛时,输出就会带有更加明显的马赛克。(文章Deconvolution and Checkerboard Artifacts中认为马赛克的产生是由于卷积时的重叠效应,不知道这一解释是否和补0的解释等价,有待验证。)

文章Deconvolution and Checkerboard Artifacts中还提到一点,即当我们对卷积层(Conv2d layer)做反向传播时,也相当于实施了一次逆卷积操作(不太理解),所以这种checkerboard artifact也会出现在梯度计算中。这在特征可视化(feature visualization)任务中也是一大挑战。

思考1:既然上采样时补0会造成artifact,那么补邻近像素值是否能解决?
思考2:如果反向传播计算梯度时仍然有checkerboard artifact,那么是否会影响CNN的收敛性?有没有更好的架构?

CNN逆卷积层(ConvTranspose2d)输出有马赛克网格相关推荐

  1. 花书+吴恩达深度学习(十)卷积神经网络 CNN 之卷积层

    目录 0. 前言 1. 2D 图像卷积 2. 3D 图像卷积 3. 过滤器(核函数) 4. 过滤器应用于边缘检测 5. padding 填充 6. stride 步长 7. 使用卷积的动机 8. 1乘 ...

  2. CNN(卷积层convolutional layer,激励层activating layer,池化层pooling,全连接层fully connected)

    CNN产生的原因:当使用全连接的神经网络时,因为相邻两层之间的神经元都是有边相连的,当输入层的特征纬度非常高时(譬如图片),全连接网络需要被训练的参数就会非常多(参数太多,训练缓慢),CNN可以通过训 ...

  3. CNN中卷积层、池化层和全连接层分别有什么作用和区别?

    卷积层:提取特征."不全连接,参数共享"的特点大大降低了网络参数,保证了网络的稀疏性,防止过拟合.之所以可以"参数共享",是因为样本存在局部相关的特性. 池化层 ...

  4. CNN网络结构——卷积层

    目录 前言 局部连接 参数共享 卷积层 卷积运算 卷积运算过程--二维 卷积运算代码实现--二维 卷积层及代码实现--三维 代码实现--3D 增加步长的卷积运算 前言 发展卷积神经网络的初衷是进行图像 ...

  5. CNN中卷积层和池化的作用和理解

    承接上文对CNN的介绍[学习笔记P20-CNN],下面来看看一些细节梳理: CNN框架: 池化层(pooling layer)也叫做子采样层(subsampling layer),其作用是进行特征选择 ...

  6. 详细解释卷积神经网络CNN中卷积层以及BN层的参数

    问题的提出 在做关于python的卷积神经网络的项目中,发现了一个卷积层加一个BN层竟然一共有6个参数.百思不得其解. if batch_norm:layers += [nn.Conv2d(in_ch ...

  7. DL之CNN可视化:利用SimpleConvNet算法【3层,im2col优化】基于mnist数据集训练并对卷积层输出进行可视化

    DL之CNN可视化:利用SimpleConvNet算法[3层,im2col优化]基于mnist数据集训练并对卷积层输出进行可视化 导读 利用SimpleConvNet算法基于mnist数据集训练并对卷 ...

  8. CNN卷积神经网络的卷积层、池化层的输出维度计算公式

    卷积层Conv的输入:高为h.宽为w,卷积核的长宽均为kernel,填充为pad,步长为Stride(长宽可不同,分别计算即可),则卷积层的输出维度为: 其中上开下闭开中括号表示向下取整. MaxPo ...

  9. CNN卷积层神经元数量、连接数量、权重数量的计算

    1. 神经元的数量: 和输入层类似,输出维度是多少,神经元就有多少 feature map大小 * feature map数量 2. 连接数量: 全连接: 输入层神经元数量*输出层神经元数量 CNN局 ...

最新文章

  1. 在Centos 6.5 上面配置 SVN
  2. MySQL is running but PID file is not found
  3. JavaScript——易班优课YOOC课群在线测试自动答题解决方案(二十二)脚本更新3.1
  4. POJ 1459 -- Power Network(最大流, 建图)
  5. 大家好!欢迎来到我的博客!
  6. NYOJ995硬币找零(简单dp)
  7. 在公司拿了奖,发了点奖金
  8. 雕虫晓技(十) Android超简单气泡效果
  9. linux如何退出python编辑器_怎么退出python
  10. mui真机调试时无法查找到手机
  11. 66岁比尔盖茨突然宣布离婚!27年前与下属恋爱修成正果,现在“无法共同成长”,分割8000亿财产...
  12. python中pop用法_python中pop()函数的用法
  13. [算法]机器人运动范围
  14. java案例代码13--斗地主部分代码--静态ArrayList的使用
  15. matlab离散信号与系统的时域分析
  16. 阿里巴巴Java开发手册 终极版
  17. 微信公众平台Js API实现微信分享
  18. java resource注解,Spring依赖注入—@Resource注解使用
  19. 使用 Python 和 Pygame 构建小行星游戏
  20. 综述:基于影像基因组学的肺癌诊断治疗方法研究

热门文章

  1. SpringBoot启动报错:org.springframework.beans.factory.UnsatisfiedDependencyException Error creating
  2. 通过java程序写一个简单的创造游戏角色的程序
  3. Java的各种运算符详解(兔C内功残篇)
  4. Excel生成Word文档
  5. js中string转map的方法
  6. java产生随机数方法
  7. 只看参数 松下S1/S1R能否算是“最强微单”?
  8. 泰凌微8258入门指导2-串口打印
  9. Linux 系统中恢复已删除的文件
  10. 用Python写一个游戏脚本,你会吗?