CNN逆卷积层(ConvTranspose2d)输出有马赛克网格
问题描述
最近在训练卷积神经网络(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)输出有马赛克网格相关推荐
- 花书+吴恩达深度学习(十)卷积神经网络 CNN 之卷积层
目录 0. 前言 1. 2D 图像卷积 2. 3D 图像卷积 3. 过滤器(核函数) 4. 过滤器应用于边缘检测 5. padding 填充 6. stride 步长 7. 使用卷积的动机 8. 1乘 ...
- CNN(卷积层convolutional layer,激励层activating layer,池化层pooling,全连接层fully connected)
CNN产生的原因:当使用全连接的神经网络时,因为相邻两层之间的神经元都是有边相连的,当输入层的特征纬度非常高时(譬如图片),全连接网络需要被训练的参数就会非常多(参数太多,训练缓慢),CNN可以通过训 ...
- CNN中卷积层、池化层和全连接层分别有什么作用和区别?
卷积层:提取特征."不全连接,参数共享"的特点大大降低了网络参数,保证了网络的稀疏性,防止过拟合.之所以可以"参数共享",是因为样本存在局部相关的特性. 池化层 ...
- CNN网络结构——卷积层
目录 前言 局部连接 参数共享 卷积层 卷积运算 卷积运算过程--二维 卷积运算代码实现--二维 卷积层及代码实现--三维 代码实现--3D 增加步长的卷积运算 前言 发展卷积神经网络的初衷是进行图像 ...
- CNN中卷积层和池化的作用和理解
承接上文对CNN的介绍[学习笔记P20-CNN],下面来看看一些细节梳理: CNN框架: 池化层(pooling layer)也叫做子采样层(subsampling layer),其作用是进行特征选择 ...
- 详细解释卷积神经网络CNN中卷积层以及BN层的参数
问题的提出 在做关于python的卷积神经网络的项目中,发现了一个卷积层加一个BN层竟然一共有6个参数.百思不得其解. if batch_norm:layers += [nn.Conv2d(in_ch ...
- DL之CNN可视化:利用SimpleConvNet算法【3层,im2col优化】基于mnist数据集训练并对卷积层输出进行可视化
DL之CNN可视化:利用SimpleConvNet算法[3层,im2col优化]基于mnist数据集训练并对卷积层输出进行可视化 导读 利用SimpleConvNet算法基于mnist数据集训练并对卷 ...
- CNN卷积神经网络的卷积层、池化层的输出维度计算公式
卷积层Conv的输入:高为h.宽为w,卷积核的长宽均为kernel,填充为pad,步长为Stride(长宽可不同,分别计算即可),则卷积层的输出维度为: 其中上开下闭开中括号表示向下取整. MaxPo ...
- CNN卷积层神经元数量、连接数量、权重数量的计算
1. 神经元的数量: 和输入层类似,输出维度是多少,神经元就有多少 feature map大小 * feature map数量 2. 连接数量: 全连接: 输入层神经元数量*输出层神经元数量 CNN局 ...
最新文章
- 在Centos 6.5 上面配置 SVN
- MySQL is running but PID file is not found
- JavaScript——易班优课YOOC课群在线测试自动答题解决方案(二十二)脚本更新3.1
- POJ 1459 -- Power Network(最大流, 建图)
- 大家好!欢迎来到我的博客!
- NYOJ995硬币找零(简单dp)
- 在公司拿了奖,发了点奖金
- 雕虫晓技(十) Android超简单气泡效果
- linux如何退出python编辑器_怎么退出python
- mui真机调试时无法查找到手机
- 66岁比尔盖茨突然宣布离婚!27年前与下属恋爱修成正果,现在“无法共同成长”,分割8000亿财产...
- python中pop用法_python中pop()函数的用法
- [算法]机器人运动范围
- java案例代码13--斗地主部分代码--静态ArrayList的使用
- matlab离散信号与系统的时域分析
- 阿里巴巴Java开发手册 终极版
- 微信公众平台Js API实现微信分享
- java resource注解,Spring依赖注入—@Resource注解使用
- 使用 Python 和 Pygame 构建小行星游戏
- 综述:基于影像基因组学的肺癌诊断治疗方法研究
热门文章
- SpringBoot启动报错:org.springframework.beans.factory.UnsatisfiedDependencyException Error creating
- 通过java程序写一个简单的创造游戏角色的程序
- Java的各种运算符详解(兔C内功残篇)
- Excel生成Word文档
- js中string转map的方法
- java产生随机数方法
- 只看参数 松下S1/S1R能否算是“最强微单”?
- 泰凌微8258入门指导2-串口打印
- Linux 系统中恢复已删除的文件
- 用Python写一个游戏脚本,你会吗?