[论文理解] Why do deep convolutional networks generalize so poorly to small image transformations?

Why do deep convolutional networks generalize so poorly to small image transformations?

Intro

CNN的设计初衷是为了使得模型具有微小平移、旋转不变性,而实际上本文通过实验验证了现在比较流行的神经网络都已经丧失了这样的能力,甚至图像只水平移动一个像素,预测的结果都将会发生很大的变化。之所以如此,作者认为CNN的下采样背离了隆奎斯特采样定理,就连augmentation也并不能缓解微小变化不变性的丧失。

Ignoring the Sampling Theorem

  1. 随机crop一张图然后resize,平移一个像素
  2. 原图rescale黑色填充背景,平移一个像素
  3. 原图rescale下方插值,平移一个像素
  4. 原图rescale,rescale相差一个像素值

结果如图,对人而言是看不出来什么区别的,但是网络的预测结果却明显不同。

仅仅这么一个微小变化,使得网络的输出发生这么大的变化,这显然是很不合理的,因此作者认为有下面的解释。

作者认为之所以CNN丧失了平移不变性是因为现在CNN的设计忽略了采样定理,也就是奈奎斯特采样定理。作者认为,CNN中的下采样操作,如stride 2 conv和pooling,由于采样频率没满足大于等于两倍的最高频,所以会导致微小形变不变性的丧失。

如何理解?

上图我做了三个实验,分别是原图、pooling后的图、conv2d(stride=4)后的图,下面是对应的频谱图。可以看出来,pooling、conv下采样层都是保留高频部分,丢弃低频部分。

可见,pooling层和conv层所做的下采样都是保留高频,丢弃低频成分。因此信号的频率都是高频,而采样频率是和stride相关的,可以理解为每隔多少像素采样一次,因此如果stride太大,采样频率就会过小,这样就不满足采样定理了。

import cv2
import numpy as np
import matplotlib.pyplot as plt
import skimage.measure
import torch
import torch.nn as nn
import torch.nn.functional as F
class FFT(object):
    def __init__(self):
        pass
    def __call__(self,x):
        f = np.fft.fft2(x)
        fshift = np.fft.fftshift(f)
        s1 = np.log(np.abs(fshift))
        return s1
    @staticmethod
    def pooling(feature_map,kernel_size= 2):
        inpt = torch.tensor(feature_map[np.newaxis,np.newaxis,:,:],dtype = torch.float32)

        out = F.max_pool2d(inpt,kernel_size = kernel_size)

        return out.numpy()[0,0,:,:]
        #return skimage.measure.block_reduce(feature_map, (kernel_size,kernel_size), np.max)
    @staticmethod
    def conv2d(feature_map,kernel_size= 2,stride = 1):
        inpt = torch.tensor(feature_map[np.newaxis,np.newaxis,:,:],dtype = torch.float32)
        kernel = torch.ones((1,1,kernel_size,kernel_size)) / kernel_size
        out = F.conv2d(inpt,weight = kernel,stride = stride)
        return out.numpy()[0,0,:,:]

if __name__ == "__main__":
    fft = FFT()
    img = cv2.imread('/home/xueaoru/图片/test002.jpg', 0)
    img2 = fft.pooling(img,4)
    img3 = fft.conv2d(img,kernel_size = 5,stride = 4)
    s1 = fft(img)
    s2 = fft(img2)
    s3 = fft(img3)
    plt.subplot(231)
    plt.imshow(img, 'gray')
    plt.title('original')

    plt.subplot(232)
    plt.imshow(img2, 'gray')
    plt.title('original2')

    plt.subplot(233)
    plt.imshow(img3, 'gray')
    plt.title('original3')

    plt.subplot(234)
    plt.imshow(s1,'gray')
    plt.title('center1')

    plt.subplot(235)
    plt.imshow(s2,'gray')
    plt.title('center2')

    plt.subplot(236)
    plt.imshow(s3,'gray')
    plt.title('center3')

    plt.show()

此外,作者还说明了一件事:

网络越深,微小形变不变性丧失的越严重。上图可以看出vgg16比较浅,还看不出什么变化,但是resnet50已经丧失很多了,densenet201也是一样。

Why don‘t modern CNNs learn to be invariant from data?

我们训练之前一般会做很多image augmentation的,但是呢,为什么image augmentation也没能缓解平移不变性的丧失呢?

一个简单的回答就是网络学习到一种简单的判别函数,使得网络对训练集的图片的变换具有微小形变不变性,而对于测试集或者说没见过的数据的微小形变不具有不变性。这称为dataset bias。

上图是imagenet上训练集里狗的眼睛距离的统计结果,也就是说,一般情况下狗的眼睛肯定在这个range内,网络可以work,然是测试数据的眼睛距离如果不在这个range内的话,网络也许就不work了,因此要求网络学习到这个range之外的数据是很难的,虽然image augmentation有所帮助,但其实很难泛化到所有情况,特别是测试集和训练集不是同一分布的时候。

Possible Solutions

  1. 将下采样替换为:stride 1 maxpooling + stride 2 conv.也就是采样之前先blur,但是对于大数据效果甚微。
  2. data augmentation:多增加额外的augmentation。
  3. 减少二次采样操作:二次采样会导致可能不满足采样定律,所以减少二次采样可以保持不变性。

原文地址:https://www.cnblogs.com/aoru45/p/12222788.html

时间: 2024-11-05 20:45:07

[论文理解] Why do deep convolutional networks generalize so poorly to small image transformations?的相关文章

VGGnet论文总结(VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION)

VGGNet的主要贡献: 1.增加了网络结构的深度 2.使用了更小的filter(3*3) 1 introduction 这部分主要说明了,由于在所有的卷积网络上使用了3*3的filter,所以使整体网络的深度加深.最后在ILSVRC取得的成绩也是十分明显的. 2 Convent Configuration 2.1 ARCHITECTURE 在前边的卷积层上,使用3*3的filter,有时也使用1*1的filter(相当于在输入channels上进行线性变换).卷积操作的步长是1.总共有5个ma

SPPNet论文翻译-空间金字塔池化Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition

http://www.dengfanxin.cn/?p=403 原文地址 我对物体检测的一篇重要著作SPPNet的论文的主要部分进行了翻译工作.SPPNet的初衷非常明晰,就是希望网络对输入的尺寸更加灵活,分析到卷积网络对尺寸并没有要求,固定尺寸的要求完全来源于全连接层部分,因而借助空间金字塔池化的方法来衔接两者,SPPNet在检测领域的重要贡献是避免了R-CNN的变形.重复计算等问题,在效果不衰减的情况下,大幅提高了识别速度. 用于视觉识别的深度卷积网络空间金字塔池化方法 Spatial Py

Very Deep Convolutional Networks for Large-Scale Image Recognition—VGG论文翻译

Very Deep Convolutional Networks for Large-Scale Image Recognition Karen Simonyan∗ & Andrew Zisserman+ Visual Geometry Group, Department of Engineering Science, University of Oxford {karen,az}@robots.ox.ac.uk 摘要 在这项工作中,我们研究了在大规模的图像识别环境下卷积网络的深度对识别的准确率

Very Deep Convolutional Networks for Large-Scale Image Recognition

Very Deep Convolutional Networks for Large-Scale Image Recognition 转载请注明:http://blog.csdn.net/stdcoutzyx/article/details/39736509 这篇论文是今年9月份的论文[1],比較新,当中的观点感觉对卷积神经网络的參数调整大有指导作用,特总结之. 关于卷积神经网络(Convolutional Neural Network, CNN),笔者后会作文阐述之,读者若心急则或可用谷歌百度

Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition

一.本文的主要思想 考虑到传统的CNN构架的输入图像的尺寸都是固定的(例如:256*256),这种人工改变输入图像的尺寸破坏了输入图像的尺度和长宽比例.作者认为卷积层的输入的尺寸可以是任意,全连接层的输入是固定不变.针对这个问题,作者提出了spatial pyramid pooling(SPP-net)结构,在目标检测方面,比R-CNN快30-170倍. 二.spatial pyramid pooling(SPP-net)的优势 1.针对不同尺寸的输入可以得到相同维度的输出,而siding wi

深度学习笔记(二)Very Deep Convolutional Networks for Large-Scale Image Recognition

Very Deep Convolutional Networks for Large-Scale Image Recognition 1. 主要贡献 本文探究了参数总数基本不变的情况下,CNN随着层数的增加,其效果的变化.(thorough evaluation of networks of increasing depth using an architecture with very small (3×3) convolution filters, which shows that a si

论文阅读笔记:Fully Convolutional Networks for Semantic Segmentation

这是CVPR 2015拿到best paper候选的论文. 论文下载地址:Fully Convolutional Networks for Semantic Segmentation 尊重原创,转载请注明:http://blog.csdn.net/tangwei2014 1.概览&主要贡献 提出了一种end-to-end的做semantic segmentation的方法,简称FCN. 如下图所示,直接拿segmentation 的 ground truth作为监督信息,训练一个端到端的网络,让

VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION 这篇论文

由Andrew Zisserman 教授主导的 VGG 的 ILSVRC 的大赛中的卷积神经网络取得了很好的成绩,这篇文章详细说明了网络相关事宜. 文章主要干了点什么事呢?它就是在在用卷积神经网络下,在采用小的卷积核与小的移动步长的情况下,探索一下网络的深度对目标识别率的影响. 网络的大体结构 网络的输入为224*224的RGB图片,后面跟卷积层,卷积核的大小基本都为3*3有最小的可以保留图片空间分瓣率的卷积核,步长为1个像素,偶尔会有1*1的卷积核,这就相当于加入了一个非线性变换而已.再往后接

SPP Net(Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition)论文理解

论文地址:https://arxiv.org/pdf/1406.4729.pdf 论文翻译请移步:http://www.dengfanxin.cn/?p=403 一.背景: 传统的CNN要求输入图像尺寸是固定的(因为全连接网络要求输入大小是固定的) crop处理,可能不包含整个物体,还会丢失上下文信息 warping处理,会导致图像变形 以上都会导致CNN对不同scale/size泛化能力不强 于是SPP做了如下改进,即将SPP层加在最后一个卷积层后面,然后再送入FC网络. 优点 不管输入尺寸为