• 一,前言卷积神经网络(Constitutional Neural Networks, CNN)是在多层神经网络的基础上发展起来的针对图像分类和识别而特别设计的一种深度学习方法。先回顾一下多层神经网络: 多层神经网络包括一个输入层和一个...

    一,前言

    卷积神经网络(Constitutional Neural Networks, CNN)是在多层神经网络的基础上发展起来的针对图像分类和识别而特别设计的一种深度学习方法。先回顾一下多层神经网络:
    这里写图片描述
    多层神经网络包括一个输入层和一个输出层,中间有多个隐藏层。每一层有若干个神经元,相邻的两层之间的后一层的每一个神经元都分别与前一层的每一个神经元连接。在一般的识别问题中,输入层代表特征向量,输入层的每一个神经元代表一个特征值。

    在图像识别问题中,输入层的每一个神经元可能代表一个像素的灰度值。但这种神经网络用于图像识别有几个问题,一是没有考虑图像的空间结构,识别性能会受到限制;二是每相邻两层的神经元都是全相连,参数太多,训练速度受到限制。

    而卷积神经网络就可以解决这些问题。卷积神经网络使用了针对图像识别的特殊结构,可以快速训练。因为速度快,使得采用多层神经网络变得容易,而多层结构在识别准确率上又很大优势。

    二,卷积神经网络的结构

    卷积神经网络有三个基本概念:局部感知域(local receptive fields),共享权重(shared weights)和池化(pooling)。

    局部感知域: 在上图中的神经网络中输入层是用一列的神经元来表示的,在CNN中,不妨将输入层当做二维矩阵排列的神经元。

    与常规神经网络一样,输入层的神经元需要和隐藏层的神经元连接。但是这里不是将每一个输入神经元都与每一个隐藏神经元连接,而是仅仅在一个图像的局部区域创建连接。以大小为28X28的图像为例,假如第一个隐藏层的神经元与输入层的一个5X5的区域连接,如下图所示:
    这里写图片描述
    这个5X5的区域就叫做局部感知域。该局部感知域的25个神经元与第一个隐藏层的同一个神经元连接,每个连接上有一个权重参数,因此局部感知域共有5X5个权重。如果将局部感知域沿着从左往右,从上往下的顺序滑动,就会得对应隐藏层中不同的神经元,如下图分别展示了第一个隐藏层的前两个神经元与输入层的连接情况。
    这里写图片描述
    这里写图片描述
    如果输入层是尺寸为28X28的图像,局部感知域大小为5X5,那么得到的第一个隐藏层的大小是24X24。

    共享权重: 上面得到的第一隐藏层中的24X24个神经元都使用同样的5X5个权重。第j个隐藏层中第k个神经元的输出为:

    σ(b+l=04m=04wl,maj+l,k+m)

    这里σ是神经元的激励函数(可以是sigmoid函数、thanh函数或者rectified linear unit函数等)。b是该感知域连接的共享偏差。wl,m是个5X5共享权重矩阵。因此这里有26个参数。 ax,y 代表在输入层的x,y处的输入激励。

    这就意味着第一个隐藏层中的所有神经元都检测在图像的不同位置处的同一个特征。因此也将从输入层到隐藏层的这种映射称为特征映射。该特征映射的权重称为共享权重,其偏差称为共享偏差。

    为了做图像识别,通常需要不止一个的特征映射,因此一个完整的卷积层包含若干个不同的特征映射。下图中是个三个特征映射的例子。
    这里写图片描述
    在实际应用中CNN可能使用更多的甚至几十个特征映射。以MNIST手写数字识别为例,学习到的一些特征如下:
    这里写图片描述
    这20幅图像分别对应20个不同的特征映射(或称作filters, kernels)。每一个特征映射由5X5的图像表示,代表了局部感知域中的5X5个权重。亮的像素点代表小的权重,与之对应的图像中的像素产生的影响要小一些。暗的像素点代表的大的权重,也意味着对应的图像中的像素的影响要大一些。可以看出这些特征映射反应了某些特殊的空间结构,因此CNN学习到了一些与空间结构有关的信息用于识别。

    池化层(pooling layers) 池化层通常紧随卷积层之后使用,其作用是简化卷积层的输出。例如,池化层中的每一个神经元可能将前一层的一个2X2区域内的神经元求和。而另一个经常使用的max-pooling,该池化单元简单地将一个2X2的输入域中的最大激励输出,如下图所示:
    这里写图片描述
    如果卷积层的输出包含24X24个神经元,那么在池化后可得到12X12个神经元。每一个特征映射后分别有一个池化处理,前面所述的卷积层池化后的结构为:
    这里写图片描述
    Max-pooling并不是唯一的池化方法,另一种池化方法是L2pooling,该方法是将卷积层2X2区域中的神经元的输出求平方和的平方根。尽管细节与Max-pooling不一样,但其效果也是简化卷积层输出的信息。

    将上述结构连接在一起,再加上一个输出层,得到一个完整的卷积神经网络。在手写数字识别的例子中输出层有十个神经元,分别对应0,1, … ,9的输出。
    这里写图片描述
    网络中的最后一层是一个全连接层,即该层的每个神经元都与最后一个Max-pooling层的每个神经元连接。

    这个结构这是一个特殊的例子,实际CNN中也可在卷积层和池化层之后可再加上一个或多个全连接层。

    三,卷积神经网络的应用

    3.1 手写数字识别

    Michael Nielsen提供了一个关于深度学习和CNN的在线电子书,并且提供了手写数字识别的例子程序,可以在GitHub上下载到。该程序使用Python和Numpy, 可以很方便地设计不同结构的CNN用于手写数字识别,并且使用了一个叫做Theano的机器学习库来实现后向传播算法和随机梯度下降法,以求解CNN的各个参数。Theano可以在GPU上运行,因此可大大缩短训练过程所需要的时间。CNN的代码在network3.py文件中。

    作为一个开始的例子,可以试着创建一个仅包含一个隐藏层的神经网络,代码如下:

    >>> import network3
    >>> from network3 import Network
    >>> from network3 import ConvPoolLayer, FullyConnectedLayer, SoftmaxLayer
    >>> training_data, validation_data, test_data = network3.load_data_shared()
    >>> mini_batch_size = 10
    >>> net = Network([
            FullyConnectedLayer(n_in=784, n_out=100),
            SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size)
    >>> net.SGD(training_data, 60, mini_batch_size, 0.1, 
                validation_data, test_data)

    该网络有784个输入神经元,隐藏层有100个神经元,输出层有10个神经元。在测试数据上达到了97.80%的准确率。

    如果使用卷积神经网络会不会比它效果好呢?可以试一下包含一个卷积层,一个池化层,和一个额外全连接层的结构,如下图
    这里写图片描述
    在这个结构中,这样理解:卷积层和池化层学习输入图像中的局部空间结构,而后面的全连接层的作用是在一个更加抽象的层次上学习,包含了整个图像中的更多的全局的信息。

    >>> net = Network([
            ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28), 
                          filter_shape=(20, 1, 5, 5), 
                          poolsize=(2, 2)),
            FullyConnectedLayer(n_in=20*12*12, n_out=100),
            SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size)
    >>> net.SGD(training_data, 60, mini_batch_size, 0.1, 
                validation_data, test_data)   

    这种CNN的结构达到的识别准确率为98.78%。如果想进一步提高准确率,还可以从以下几方面考虑:

    1. 再添加一个或多个卷积-池化层
    2. 再添加一个或多个全连接层
    3. 使用别的激励函数替代sigmoid函数。比如Rectifed Linear Units函数: f(z)=max(0,z). Rectified Linear Units函数相比于sigmoid函数的优势主要是使训练过程更加快速。
    4. 使用更多的训练数据。Deep Learning因为参数多而需要大量的训练数据,如果训练数据少可能无法训练出有效的神经网络。通常可以通过一些算法在已有的训练数据的基础上产生大量的相似的数据用于训练。例如可以将每一个图像平移一个像素,向上平移,向下平移,向左平移和向右平移都可以。
    5. 使用若干个网络的组合。创建若干个相同结构的神经网络,参数随机初始化,训练以后测试时通过他们的输出做一个投票以决定最佳的分类。其实这种Ensemble的方法并不是神经网络特有,其他的机器学习算法也用这种方法以提高算法的鲁棒性,比如Random Forests。

    3.2 ImageNet图像分类

    Alex Krizhevsky等人2012年的文章“ImageNet classification with deep convolutional neural networks”对ImageNet的一个子数据集进行了分类。ImageNet一共包含1500万张有标记的高分辨率图像,包含22,000个种类。这些图像是从网络上搜集的并且由人工进行标记。从2010年开始,有一个ImageNet的图像识别竞赛叫做ILSVRC(ImageNet Large-Scale Visual Recognition Challenge)。 ILSVRC使用了ImageNet中的1000种图像,每一种大约包含1000个图像。总共有120万张训练图像,5万张验证图像(validation images)和15万张测试图像(testing images)。该文章的方法达到了15.3%的错误率,而第二好的方法错误率是26.2%。
    这里写图片描述

    这篇文章中使用了7个隐藏层,前5个是卷积层(有些使用了max-pooling),后2个是全连接层。输出层是有1000个单元的softmax层,分别对应1000个图像类别。

    该CNN使用了GPU进行计算,但由于单个GPU的容量限制,需要使用2个GPU (GTX 580,分别有3GB显存)才能完成训练。

    该文章中为了防止过度拟合,采用了两个方法。一是人工生成更多的训练图像。比如将已有的训练图像进行平移或者水平翻转,根据主成分分析改变其RGB通道的值等。通过这种方法是训练数据扩大了2048倍。二是采用Dropout技术。Dropout将隐藏层中随机选取的一半的神经元的输出设置为0。通过这种方法可以加快训练速度,也可以使结果更稳定。
    这里写图片描述
    输入图像的大小是224X224X3,感知域的大小是11X11X3。第一层中训练得到的96个卷积核如上图所示。前48个是在第一个GPU上学习到的,后48个是在第二个GPU上学习到的。

    3.3 医学图像分割

    Adhish Prasoon等人在2013年的文章“Deep feature learning for knee cartilage segmentation using a triplanar convolutional neural network”中,用CNN来做MRI中膝关节软骨的分割。传统的CNN是二维的,如果直接扩展到三维则需要更多的参数,网络更复杂,需要更长的训练时间和更多的训练数据。而单纯使用二维数据则没有利用到三维特征,可能导致准确率下降。为此Adhish采用了一个折中方案:使用xy,yzxz三个2D平面的CNN并把它们结合起来。
    这里写图片描述

    三个2D CNN分别负责对xy,yzxz平面的处理,它们的输出通过一个softmax层连接在一起,产生最终的输出。该文章中采用了25个病人的图像作为训练数据,每个三维图像中选取4800个体素,一共得到12万个训练体素。相比于传统的从三维图像中人工提取特征的分割方法,该方法在精度上有明显的提高,并且缩短了训练时间。

    3.4 谷歌围棋AlphaGo战胜人类

    谷歌旗下DeepMind团队使用深度卷积神经网络在电脑围棋上取得了重大突破。早期,IBM的深蓝超级计算机通过强大的计算能力使用穷举法战胜了人类专业象棋选手,但那不算“智能”。

    围棋上的计算复杂度远超象棋,即使通过最强大的计算机也无法穷举所有的可能的走法。计算围棋是个极其复杂的问题,比国际象棋要困难得多。围棋最大有3^361 种局面,大致的体量是10^170,而已经观测到的宇宙中,原子的数量才10^80。国际象棋最大只有2^155种局面,称为香农数,大致是10^47。

    DeepMind所研究的AlphaGo使用了卷积神经网络来学习人类下棋的方法,最终取得了突破。AlphaGo在没有任何让子的情况下以5:0完胜欧洲冠军,职业围棋二段樊麾。研究者也让AlphaGo和其他的围棋AI进行了较量,在总计495局中只输了一局,胜率是99.8%。它甚至尝试了让4子对阵Crazy Stone,Zen和Pachi三个先进的AI,胜率分别是77%,86%和99%。可见AlphaGo有多强大。

    在谷歌团队的论文中,提到“我们用19X19的图像来传递棋盘位置”,来“训练”两种不同的深度神经网络。“策略网络”(policy network)和 “值网络”(value network)。它们的任务在于合作“挑选”出那些比较有前途的棋步,抛弃明显的差棋,从而将计算量控制在计算机可以完成的范围里,本质上和人类棋手所做的一样。

    其中,“值网络”负责减少搜索的深度——AI会一边推算一边判断局面,局面明显劣势的时候,就直接抛弃某些路线,不用一条道算到黑;而“策略网络”负责减少搜索的宽度——面对眼前的一盘棋,有些棋步是明显不该走的,比如不该随便送子给别人吃。利用蒙特卡洛拟合,将这些信息放入一个概率函数,AI就不用给每一步以同样的重视程度,而可以重点分析那些有戏的棋着。
    这里写图片描述
    参考论文:David Silver, et al. “Mastering the game of Go with deep neural networks and tree search.” Nature doi:10.1038/nature16961.
    相关链接:http://www.guokr.com/article/441144/

    展开全文
  • 对人类来说,描述我们眼睛所看到的事物,即“视觉世界”,看起来太微不足道了,以至于我们根本没有意识到那正是我们时时刻刻在做的事情。在看到某件事物时,不管是汽车、大树,还是一个人,我们通常都不需要过多的...

    对人类来说,描述我们眼睛所看到的事物,即“视觉世界”,看起来太微不足道了,以至于我们根本没有意识到那正是我们时时刻刻在做的事情。在看到某件事物时,不管是汽车、大树,还是一个人,我们通常都不需要过多的思考就能立刻叫出名字。然而对于一台计算机来说,区分识别“人类对象”(比如:在小狗、椅子或是闹钟这些“非人类对象”中识别出奶奶这一“人类对象”)却是相当困难的。

    能解决这一问题可以带来非常高的收益。“图像识别”技术,更宽泛地说是“计算机视觉”技术,是许多新兴技术的基础。从无人驾驶汽车和面部识别软件到那些看似简单但十分重要的发展成果——能够监测流水线缺陷和违规的“智能工厂”,以及保险公司用来处理和分类索赔照片的自动化软件。这些新兴科技是离不开“图像识别”的。

    在接下来的内容里,我们将要探究“图像识别”所面临的问题和挑战,并分析科学家是如何用一种特殊的神经网络来解决这一挑战的。

    学会“看”是一项高难度、高成本的任务

    着手解决这个难题,我们可以首先将元数据应用于非结构化数据。在之前的文章里,我们曾描述过在元数据稀缺或元数据不存在的情况下,进行文本内容分类和搜索遇到的一些问题和挑战。让专人来对电影和音乐进行人工分类和标记,确实是一项艰巨的任务。但有些任务不仅艰巨,甚至是几乎不可能完成的。比如训练无人驾驶汽车里的导航系统,让其能够将其他车辆与正在过马路的行人区分开来;或者是每天对社交网站上用户上传的千千万万张的照片和视频进行标记、分类和筛查。

    唯一能够解决这一难题的方法就是神经网络。理论上我们可以用常规的神经网络来进行图像分析,但在实际操作中,从计算角度看,使用这种方法的成本非常高。举例来说,一个常规的神经网络,就算是处理一个非常小的图像,假设是30*30像素图像,仍需要900个数据输入和五十多万个参数。这样的处理加工对一个相对强大的机器来说还是可行的;但是,如果需要处理更大的图像,假设是500*500像素的图像,那么机器所需的数据输入和参数数量就会大大增加,增加到难以想象的地步。

    除此之外,将神经网络用于“图像识别”还可能会导致另一个问题——过度拟合。简单来说,过度拟合指的是系统训练的数据过于接近定制的数据模型的现象。这不仅会在大体上导致参数数量的增加(也就是进一步计算支出的增加),还将削弱“图像识别”在面临新数据时其他常规功能的正常发挥。

    真正的解决方案——卷积

    幸运的是,我们发现,只要在神经网络的结构方式上做一个小小的改变,就能使大图像的处理更具可操作性。改造后的神经网络被称作“卷积神经网络”,也叫CNNs或ConvNets。

    神经网络的优势之一在于它的普遍适应性。但是,就像我们刚刚看到的,神经网络的这一优势在图像处理上实际上是一种不利因素。而“卷积神经网络”能够对此作出一种有意识的权衡——为了得到一个更可行的解决方案,我们牺牲了神经网络的其他普遍性功能,设计出了一个专门用于图像处理的网络。

    在任何一张图像中,接近度与相似度的关联性都是非常强的。准确地说,“卷积神经网络”就是利用了这一原理。具体而言就是,在一张图像中的两个相邻像素,比图像中两个分开的像素更具有关联性。但是,在一个常规的神经网络中,每个像素都被连接到了单独的神经元。这样一来,计算负担自然加重了,而加重的计算负担实际上是在削弱网络的准确程度。

    卷积网络通过削减许多不必要的连接来解决这一问题。运用科技术语来说就是,“卷积网络”按照关联程度筛选不必要的连接,进而使图像处理过程在计算上更具有可操作性。“卷积网络”有意地限制了连接,让一个神经元只接受来自之前图层的小分段的输入(假设是3×3或5×5像素),避免了过重的计算负担。因此,每一个神经元只需要负责处理图像的一小部分(这与我们人类大脑皮质层的工作原理十分相似——大脑中的每一个神经元只需要回应整体视觉领域中的一小部分)。

    “卷积神经网络”的内在秘密

    “卷积神经网络”究竟是如何筛选出不必要的连接的呢?秘密就在于两个新添的新型图层——卷积层和汇聚层。我们接下来将会通过一个实操案例:让网络判断照片中是否有“奶奶”这一对象,把“卷积神经网络”的操作进行分解,逐一描述。

    第一步,“卷积层”。“卷积层”本身实际上也包含了几个步骤:

    1.首先,我们会将奶奶的照片分解成一些3×3像素的、重叠着的拼接图块。

    2.然后,我们把每一个图块运行于一个简单的、单层的神经网络,保持权衡不变。这一操作会使我们的拼接图块变成一个图组。由于我们一开始就将原始图像分解成了小的图像(在这个案例中,我们是将其分解成了3×3像素的图像),所以,用于图像处理的神经网络也是比较好操作的。

    3.接下来,我们将会把这些输出值排列在图组中,用数字表示照片中各个区域的内容,数轴分别代表高度、宽度和颜色。那么,我们就得到了每一个图块的三维数值表达。(如果我们讨论的不是奶奶的照片,而是视频,那么我们就会得到一个四维的数值表达了。)

    说完“卷积层”,下一步是“汇聚层”。

    “汇聚层”是将这个三维(或是四维)图组的空间维度与采样函数结合起来,输出一个仅包含了图像中相对重要的部分的联合数组。这一联合数组不仅能使计算负担最小化,还能有效避免过度拟合的问题。

    最后,我们会把从“汇聚层”中得出的采样数组作为常规的、全方位连接的神经网络来使用。通过卷积和汇聚,我们大幅度地缩减了输入的数量,因此,我们这时候得到的数组大小是一个正常普通网络完全能够处理的,不仅如此,这一数组还能保留原始数据中最重要的部分。这最后一步的输出结果将最终显示出系统有多少把握作出“照片中有奶奶”的判断。

    以上只是对“卷积神经网络”工作过程的简单描述,现实中,其工作过程是更加复杂的。另外,跟我们这里的案例不同,现实中的“卷积神经网络”处理的内容一般包含了上百个,甚至上千个标签。

    “卷积神经网络”的实施

    重新开始建立一个“卷积神经网络”是一项非常耗时且昂贵的工作。不过,许多API最近已经实现了——让组织在没有内部计算机视觉或机器学习专家的帮助下,完成图像分析的收集工作。

    • “谷歌云视觉”是谷歌的视觉识别API,它是以开源式TensorFlow框架为基础的,采用了一个REST API。“谷歌云视觉”包含了一组相当全面的标签,能够检测单个的对象和人脸。除此之外,它还具备一些附加功能,包括OCR和“谷歌图像搜索”。

    • “IBM沃森视觉识别”技术是“沃森云开发者”的重要组成部分。它虽然涵盖了大量的内置类集,但实际上,它是根据你所提供的图像来进行定制类集的训练的。与“谷歌云视觉”一样,“IBM沃森视觉识别”也具备许多极好的功能,比如OCR和NSFW检测功能。

    • Clarif.ai是图像识别服务的“后起之秀”,它采用了一个REST API。值得一提的是,Clarif.ai包含了大量的单元,能够根据特定的情境定制不同的算法。像婚礼、旅游甚至食物。

    上面的这些API更适用于一些普通的程序,但对于一些特殊的任务,可能还是需要“对症下药”,制定专门的解决方案。不过值得庆幸的是,许多数据库可以处理计算和优化方面的工作,这或多或少地减轻了数据科学家和开发人员的压力,让他们有更多精力关注于模型训练。其中,大部分的数据库,包括TensorFlow,深度学习4J和Theano,都已经得到了广泛、成功的应用。

    展开全文
  • 基于深度卷积神经网络的图像去噪方法 摘要:图像去噪在图像处理中仍然是一个具有挑战性的问题。作者提出了一种基于深度卷积神经网络(DCNN)的图像去噪方法。作者设计的不同于其他基于学习的方法:一个DCNN来实现...

    基于深度卷积神经网络的图像去噪方法

     

    摘要:图像去噪在图像处理中仍然是一个具有挑战性的问题。作者提出了一种基于深度卷积神经网络(DCNN)的图像去噪方法。作者设计的不同于其他基于学习的方法:一个DCNN来实现噪声图像。因此,通过从污染图像中分离噪声图像可以实现潜在清晰图像。在训练阶段,采用梯度裁剪方案来防止梯度爆炸,并使网络能够快速收敛。实验结果表明,与现有技术的去噪方法相比,所提出的去噪方法可以实现更好的性能。同时,结果表明,去噪方法具有通过一个单一的去噪模型抑制不同噪声水平的不同噪声的能力。

    1.介绍

    图像去噪,其目的是从其噪声观察值y中估计潜在干净图像x,对于随后的图像处理非常重要。给定一个加性高斯白噪声模型,它可以表示为:

    y = x +z

    因此,图像去噪的目标是从中找出x的估计值 y,其中x∈RN表示干净的(未知的)干净图像,其中,表示具有零均值和协方差矩阵σ2I(其中I是单位矩阵)的高斯噪声向量,y∈N表示观察到的噪声图像。

    基于滤波的方法[1],基于扩散的方法[2],基于总变差的方法[3,4],基于小波/曲线波的方法[5-7]等,基于稀疏表示的方法[8-11],基于非局部自相似性(NSS)的方法[11-18]等。在这些方法中,NSS模型在现有方法中很流行。它们表现出很好的去噪效果,特别是对于具有规则和重复纹理的图像。这是因为非局部的基于方法的方法通常对于具有规则和重复纹理的图像更好,而基于区别性训练的方法更好方法通常对不规则纹理或光滑区域的图像产生更好的结果[19]。然而,NSS模型不可避免地存在两个主要缺点[12,17,18]。首先,他们经常需要指定一个特定的去噪功能结果是该算法可能不能对各种图像实施良好的去噪作业。其次,这些模型通常是非凸的,并且涉及多个手动选择的参数,为提高去噪性能提供了一些余地。

    为了解决这些问题,最近开发了几种有区别的学习方法来学习图像先验模型,如可训练的非线性反应扩散(TNRD)模型[20]。TNDR模型是通过展开固定数目的梯度下降推断步骤。然而,TNDR模型固有地局限于特定形式的先验。 具体而言,TNRD采用的先例是基于分析模型,该模型在捕获图像结构的全部特征方面有限。

    实际上,TNRD模型是一种深度神经网络,可以表示为前馈深层网络。还有一些深度神经网络用于图像去噪[21-23]。Jain和Seung首先使用深度神经网络进行图像去噪[21]。他们声称深度神经网络具有相似或甚至比马尔可夫随机场模型在图像去噪方面具有更好的表示能力。Burger等人提出使用多层感知器(MLP)进行图像去噪[22]。此外,他们将稀疏编码和预先训练过的深度神经网络结合起来去噪自动编码器[23]。尽管这些深度神经网络在图像去噪方面取得了很好的性能,但这些网络并没有有效地探索图像的固有特征,因为它们将类似MLP的网络级联起来。

    目前,深度卷积神经网络(DCNN)吸引了越来越多的研究人员,因为它通过大量数据具有很好的自学习能力,不需要严格选择特征,只需要引导学习来达到期望的目的。它被广泛应用于图像预处理领域,如图像超分辨率[24-26]。由于图像超分辨率的成功,一些研究人员尝试将DCNN应用于图像去噪[27-29]。 Lefkimmiatis提出了一种基于非局部图像模型的基于灰度和彩色图像去噪的新型深度网络体系结构[29]。正如作者所声称的那样,所提出的方法确实是一种NSS方法,它利用DCNN学习NSS方法的参数。在[27,28]中,作者直接使用DCNN来实现去噪任务,其中将被污染的图像输入到DCNN中并且输出相应的潜在干净图像。此外,随机梯度下降法被用作训练策略,这将在训练中耗费大量时间。

    尽管DCNN成功实现了图像超分辨率,但不能直接用于图像去噪。这是因为图像超分辨率和图像去噪的任务完全不同。对于图像超解决方案,其任务是从丢失了很多的低分辨率图像重建高分辨率图像因此,DCNN可以通过低分辨率图像直接预测高分辨率图像,因为卷积图层可能涉及预测输出图像中的丢失信息。对于图像去噪,其任务是从噪声叠加在原始干净图像上的污染图像中重建潜在干净图像。与噪声图像相比,潜在的干净图像包含更多信息。如果DCNN直接预测像图像超分辨率的DCNN那样的潜在干净图像,则输出图像中的现有信息比噪声图像中存在的信息更复杂。这意味着预测噪声图像的网络的学习负担远远低于预测潜在干净图像的网络的负担。

    受噪声分量与污染图像分离的启发[30-32],我们精心设计了一个DCNN来预测本文中的噪声图像,称为IDCNN。然后,潜在的干净的图像可以通过分离预测来实现来自污染图像的噪声图像。此外,我们讨论网络深度对降噪性能的影响。 此外,还讨论了一些网络参数。最后,我们进行了一系列比较实验来验证所提出的图像去噪方法。

    本文的结构如下:在第2节中,我们详细说明了IDCNN的网络体系结构和实现。在第3节中,演示了实验结果和讨论。结论在第4节中提出。

    2设计的DCNN的网络结构

    卷积神经网络是线性滤波和非线性变换操作的交替序列。输入层和输出层包含一个或多个图像,输出层也可以是矢量。网络的中间层称为隐藏单元,每个隐藏单元的输出称为特征映射。

    2.1卷积层和激活功能

    在第l卷积层(隐藏单元),先前层的特征映射(xil-1)与卷积核(wijl)卷积,并且输出特征映射(xjl)通过激活函数F实现。每个输出特征映射 可以将卷积与多个输入特征图结合起来,制定为:

      

    其中Mj表示输入特征图的选择,bj表示偏差,*表示卷积算子。

    相同的尺寸。其整体结构如图1所示。给定深度d的IDCNN,每一层使用相同的卷积运算。卷积运算实际上是一种线性滤波。卷积运算的线性组合由于其线性特性而不能代表非平凡问题。因此,在DCNN中,非线性激活函数被应用于每个卷积层的输出作为下一层的输入,以便允许这样的网络仅使用少量节点来计算非平凡问题。整流线性单元(ReLU)[33]通常用作DCNN中的激活函数,它是一种非线性映射。已经证明使用整流器作为非线性可以在不需要无监督的预训练的情况下训练深度监督神经网络。与S形函数或类似的激活函数相比,ReLU可以在大型复杂数据集上快速有效地训练深度神经结构。

     

    2.2损失函数和梯度裁剪

    X和Y^表示输入被污染的图像和输出噪声图像,分别。给定一个训练数据集{Xi,Yi }i= 1N,我们的目标是学习一个预测值的模型,其中Y ^是所需干净图像Y的估计值。因此,损失函数是

     

    其中θ=[ W,b]是DCNN的网络参数。W是权重矩阵,b是(2)中定义的偏向量。我们的目标是最小化损失函数以找到DCNN的最优参数θ。

    显然,最小化F(θ)是解决非凸优化问题。随机梯度下降法通常用于解决这个优化问题,它通过反向传播不断调整和优化网络参数。我们试图用随机梯度下降来训练提出的DCNN。不幸的是,在我们提出的网络中,我们发现无论如何调整学习速率和其他网络参数,网络几乎不会收敛,网络性能也不好。当学习率> 0.01时,网络甚至不能收敛。这表明随机梯度下降在我们提出的网络中使用时可能导致梯度爆炸。为了避免这些问题,常用的策略之一是将单个渐变剪裁到预定范围[-β,β]。因此,在训练过程中,梯度保持在一定范围内。我们使用给定的渐变裁剪方案阈值[34,35]。假设给定的梯度阈值为β,则当前梯度值为g。如果| | G | | ≥β,那么

     

    因此,当训练期间当前梯度值超过给定阈值时,将当前梯度值分配给

    β/ || g ||)g。所以,梯度在固定范围内变化,以便设计的DCNN快速收敛。

    2.3设计的网络架构

    设计的网络结构如图1所示。一个大小为43×43的污染图像被输入到设计的DCNN中,相应的输出是预测的噪声图像,输出的尺寸是43×43。深度的本文设计的网络设置为10。在设计的DCNN中有几个卷积层,但没有池化层。在每个卷积层中,有64个5×5卷积核。

    众所周知,增加感受域的大小可以利用更大图像区域中的上下文信息[21]。在这里,感受野在CNN中在空间上是连续的。CNN通过强化相邻层神经元之间的局部连通性模式来利用空间局部相关性[36]。换句话说,第m层中的卷积层的输入是第(m-1)层中卷积层的子集的输出。因此,形成了空间上连续的感受野。然而,每个卷积层对于输入之外的感受域之外的变化没有响应,这确保学习的卷积核对空间局部输入模式产生最强响应。然而,我们可以堆叠许多这样的层以使卷积核变得越来越全球化(即,响应于更大的像素空间区域)。换一种说法,随着网络深度的增加,感受野的大小增加。假设我们对所有图层使用n×n相同大小的卷积核。对于第一层,接受场的大小是n×n。对于第二层,大小感受野在高度和宽度上增加(n-1)等等。因此,如果设计的DCNN的深度是d,其感受野是[(n-1)d + 1]×[(n-1)d + 1]。

    由于实验平台的局限性,设计的DCNN的深度d被设置为10.似乎卷积核的尺寸越大,设计的DCNN的接收场的尺寸越大,其中固定深度是并且设计的DCNN实现更好的性能。但值得一提的是,所有卷积操作都不使用零填充来避免训练期间的边界效应。在测试阶段,所有的卷积层都有足够的零填充。因此,过零填充会导致严重失真。而且,尺寸较大的卷积核与较小尺寸的卷积核相比,会导致较大的计算负担[26]。因此,卷积核的适当大小有助于设计的DCNN。在这里,我们将卷积核的大小设置为5×5。如上面的段落所示,接受但为了确保网络在训练过程中具有良好的灵活性,我们选择了尺寸为43×43的输入图像。我们还进行了一个实验来验证输入训练与那些尺寸为43×43的图像相比,可以实现良好的性能其他尺寸。详情请参阅第3.4节。

    每个卷积层上的更多卷积核可以获得更多的特征映射,这表明可以表示输入图像的更多潜在特征。然而,超过一定水平的特征映射太多会使训练过程在数值上不稳定[37]。64个卷积核通常用于大多数DCNN [24,26]。所以,我们在每个卷积层也使用64个卷积核。

     

    3实验结果和讨论

    3.1设计的DCNN的实现

    我们使用Caffe [38]来训练设计的DCNN。Caffe是一个深思熟虑的表达,速度和模块化的深度学习框架。它是一个完全开源的框架,可以提供对深层体系结构的明确访问。它的代码是用干净,高效的C ++编写的,CUDA用于GPU计算,以及几乎完整的支持Python / Numpy和MATLAB的绑定。使用协议缓冲区语言将Caffe模型定义写为配置文件。使用Caffe训练DCNN时,网络架构和训练参数预先配置为配置文件。如果有新图层的话在原有的Caffe框架中不存在的都是在DCNN中添加的,他将与这些新层相关的代码编入原来的Caffe框架中。

    在实验中,动量和重量衰减参数分别设为0.9和0.0001。采用[39]中描述的方法来初始化权重。

    所有的实验都是通过一台带有NVIDIA Quadro K4200 4G,CPU Intel Xeon E5-2630 @ 2.3 GHz和16 GB内存的图形工作站进行的。我们使用MatConvNet软件包[40]进行了比较实验。

    3.2数据预处理和度量

    在下面的实验中,从数据集[41]和伯克利分割数据集[42]中选择的图像被用来构建训练数据集。图像通过旋转和缩放来增强。为了简单起见,所有图像都转换成灰度图像。具有不同噪声水平的高斯噪声叠加到所有图像上。图像由43×43像素的滑动窗口裁剪,两个相邻子图像之间的滑动距离为14像素。该值位于重叠窗口中的像素对于两个相邻的子图像是相同的。因此,这些裁剪的子图组成了训练数据集。

    采用峰值信噪比(PSNR,以dB为单位)作为评估去噪方法性能的指标。

    3.3设计的DCNN的非固定噪声掩膜

    通常,在DCNN方法中,具有相同噪声水平的训练污染图像通常使用固定噪声掩模[23]。换句话说,ε是(1)中的固定矩阵。但是,我们发现具有非固定噪声掩码的训练数据集可以与固定噪声掩模相比,表现更好。也就是说,对于我们的训练数据集,对于每个噪声水平,ε是(1)中的非固定矩阵。

    为了证明非固定噪声掩模的优势,我们进行了一项实验,以比较设计的DCNN针对固定和非固定噪声掩模所实现的去噪性能。从[41]中选择的91个图像按3.2节所述进行预处理以组成训练数据集。如图2所示,选择三个图像进行测试,分别是'摄影师','家'和'莉娜'。不失一般性,我们将噪声水平设为δ= 20。我们设定了设计的深度 DCNN到10。图3说明了由固定和未固定噪声掩模设计的DCNN实现的去噪结果。如图3所示,可以看出,使用非固定噪声掩模设计的DCNN比使用固定噪声掩模的DCNN具有更好的去噪性能。

     

    3.4初始学习率

    学习率对于所提议的网络的收敛是重要的。我们进行了一个实验来讨论初始学习率对网络性能的影响。培训和测试数据与第3.3节所述的相同。我们相应地将初始学习率设置为0.2,0.1,0.01和0.001。在每20个训练时期后,他们减少0.1。如图4所示,设计的具有梯度限幅的DCNN可以在不同的初始学习速率下获得良好的收敛性和良好的去噪效果。当初始学习率为0.1时,设计的DCNN达到最佳收敛。事实表明,通过调整初始学习速率,我们可以实现(3)中的优化问题函数的近似最优解,尽管梯度限幅不能保证全局最小。 

     

    3.5设计的DCNN的深度和输入训练图像的大小

    为了研究设计的DCNN的性能与其深度之间的关系,我们进行了一些实验,其中设计的DCNN的深度被设置为4,6,8和10.由于我们的计算性能的限制 硬件,为了方便起见,我们将网络的最大深度设置为10。训练和测试数据与第3.3节所述的相同。如表1所示,网络深度越大,PSNR的值越高,这意味着所提出的去噪方法实现的性能越好。该主观评估也验证了这一事实,如图5所示。然而,网络的深度通常意味着更多的参数,这使得扩大的网络更容易出现过度拟合[43]。所以,一个适当的深度网络对融合和网络性能非常重要。




    输入训练图像的大小与卷积核的大小和网络的深度有关。我们进行了一个实验来证明输入训练图像的大小对设计的DCNN的去噪性能的影响。在这里,我们设置网络深度为10,卷积核的大小为5×5。我们用不同大小(20×20,43×43,96×96)的输入图像训练了设计网络。第一种和第三种尺寸分别在[27,28]中使用。第二个被认为是合适的大小在本文中。在实验中,被污染图像的噪声水平均为σ= 20。同时,选择PSNR作为度量。如表2所示,输入43×43的训练图像的设计网络达到最佳去噪结果。事实验证43×43是设计网络输入训练图像的适当大小,这在2.3节中讨论。


    3.6几种噪声级别的单一模型

    我们发现,单个模型提出的去噪方法能够同时抑制不同噪声水平的不同噪声。这意味着具有不同噪声水平的图像可以作为训练集被同时输入,因此我们可以使用训练过的单一网络模型去除具有不同噪声水平的图像中存在的噪声。

    在这里,我们进行了实验来验证网络的这一特性。 培训和测试数据与第3.3节所述的相同。噪声水平δ= 15,20和25时,图像受到不同噪声的污染。在实验中,我们独立训练设计的DCNN相对于不同的噪声等级,相应地在表3中分别表示为Model_15,Model_20和Model_25。为了说明单个模型对于多个噪声水平的能力,设计的DCNN也通过同时输入具有不同噪声水平的训练对来训练,在表3中表示为Model_mixture。显然,与混合模型相比,Model_mixture也可以实现相当好的去噪性能 独立训练的模型。

     

    3.7拟议方法与最先进方法之间的比较

    在本节中,我们将对18个广泛使用的自然图像进行比较实验(如图6所示)。 标准偏差σ= 15,25,50的高斯白噪声被添加到那些测试图像中。我们训练设计的DCNN超过60个时期(每个时期包括9771次迭代,批量大小为64)。

     

    为了验证所提出的去噪方法,我们将其与几种最先进的去噪方法(包括BM3D [12],EPLL [27],WNNM [17],加权Schatten p-范数最小化(WSNM)[18] ,MLP [22]和TNRD [19]。这些比较方法的实现代码由相应的作者提供,可以从作者的网站下载。请注意,由[22]中的方法实现的噪声水平δ= 15的去噪结果未提供,因为作者没有提供具有此噪声水平的模型。对于我们提出的方法,我们通过3.6节所示的两种方案来训练设计的DCNN。一个训练对由每个噪音水平独立训练。然后,训练的DCNN用于抑制具有相同噪声水平的噪声。在这里,我们将这个降噪模型称为IDCNN-1。另一个是通过同时输入具有不同噪声水平的训练对来训练的。然后,训练的DCNN用于抑制具有不同噪声级别的噪声。我们将此降噪模型称为IDCNN-2。

    如表4-6所示,每个图像的每个噪声级别的最佳PSNR以粗体突出显示。可以看出,与其他去噪方法相比,所提出的去噪方法,特别是IDCNN-1,可以实现大部分图像的最佳性能。这是因为DCNN对于大量的训练数据具有良好的学习能力,并且探索了图像中存在的固有特征。IDCNN-2也能实现很好的去噪效果,尽管它只是一个噪声级别的单一模型。特别是,IDCNN-2在几种图像中实现了最佳的去噪性能,噪声水平δ= 50。这表明IDCNN-2对图像具有很好的泛化能力降噪。不幸的是,我们的方法不能仅在两个图像'House'和'Barbara'具有每个噪声级别时才能实现最佳性能。正如文献[19]所推论的,BM3D和NSS方法(这里是WNNM和WSNM)是内部去噪方法,在主要是具有规则和重复纹理的图像上,其优于外部去噪方法。学习方法(这里是MLP,TNRD和IDCNN)和EPLL是外部去噪方法[19]。但是,对于包含平滑区域或不规则纹理的图像,外部去噪方法优于内部去噪方法。这里有两个例子在图7中对平滑区域或不规则纹理与规则和重复纹理进行了说明。虽然[22]和TNRD中的MLP是深度神经网络,但我们提出的方法也比这两种方法获得更好的去噪性能。这是因为与我们设计的DCNN相比,这两种方法并没有有效地探索图像的固有特性,因为它们级联了类MLP网络。


    另外,我们在表4-6中说明每种方法的运行时间。WNNM和WSNM方法是两种NSS方法,它们应该找到非凸模型的解。这会导致沉重的计算负担。 因此,WNNM和WSNM方法消耗表中方法中的运行时间最多。EPLL方法涉及最大后验估计以在每次迭代中更新图像块。这个操作会导致EPLL方法在计算速度上不好。BM3D是一种基于过滤的去噪方法。所以,这是非常耗时的。TNRD和IDCNNs也取得了相当好的计算性能,因为这些方法是端到端的学习方法。

    选择两个例子来说明通过不同方法去噪视觉表现(如图8和9所示)。 图8说明了在噪声水平δ= 25的情况下通过不同方法获得的视觉结果,并且图9表示噪声水平δ= 50的情况下的视觉结果。每个图像的一小部分被放大并显示以用于清晰显示,这是由一个突出显示的红色窗口标记。从图8和图9可以看出,与其他IDCNN-1和IDCNN-2相比,它可以实现很好的去噪效果并且很好地重建了潜在的清晰图像去噪方法,特别是由于保留尖锐的边缘和细节。因此,视觉效果评估的对比实验与上述客观评估一致,验证了我们提出的去噪方法的有效性。

     


    4、结论

    在本文中,我们提出一种基于深度卷积神经网络的图像去噪方法,称为IDCNN。与其他最先进的学习方法不同,所设计的DCNN在污染图像输入网络时预测噪声图像。然后,通过将预测噪声图像与污染图像分离来实现潜在清晰图像。 我们进行了一些实验来探索设计的DCNN的特性。我们发现网络的深度越大,所提出的去噪方法的性能越好。此外,提出了一种单一模型的去噪方法具有同时抑制不同噪声级别的不同噪声的能力。对比实验结果验证了该方法的良好去噪能力,表明它为图像去噪提供了一种有效的解决方案。

    展开全文
  • https://mp.weixin.qq.com/s?__biz=MzA3MzI4MjgzMw==&mid=2650728746&idx=1&sn=61e9cb824501ec7c505eb464e8317915&scene=0#wechat_redirect 感谢机器之心的翻译!保存下来以便以后复习方便一些!...

    https://mp.weixin.qq.com/s?__biz=MzA3MzI4MjgzMw==&mid=2650728746&idx=1&sn=61e9cb824501ec7c505eb464e8317915&scene=0#wechat_redirect

    感谢机器之心的翻译!保存下来以便以后复习方便一些!

    近日,Dishashree Gupta 在 Analyticsvidhya 上发表了一篇题为《Architecture of Convolutional Neural Networks (CNNs) demystified》的文章,对用于图像识别和分类的卷积神经网络架构作了深度揭秘;作者在文中还作了通盘演示,期望对 CNN 的工作机制有一个深入的剖析。机器之心对本文进行了编译,原文链接见文末。

    引言

           先坦白地说,有一段时间我无法真正理解深度学习。我查看相关研究论文和文章,感觉深度学习异常复杂。我尝试去理解神经网络及其变体,但依然感到困难。

          接着有一天,我决定一步一步,从基础开始。我把技术操作的步骤分解开来,并手动执行这些步骤(和计算),直到我理解它们如何工作。这相当费时,且令人紧张,但是结果非凡。

           现在,我不仅对深度学习有了全面的理解,还在此基础上有了好想法,因为我的基础很扎实。随意地应用神经网络是一回事,理解它是什么以及背后的发生机制是另外一回事。

           今天,我将与你共享我的心得,展示我如何上手卷积神经网络并最终弄明白了它。我将做一个通盘的展示,从而使你对 CNN 的工作机制有一个深入的了解。

           在本文中,我将会讨论 CNN 背后的架构,其设计初衷在于解决图像识别和分类问题。同时我也会假设你对神经网络已经有了初步了解。

    目录

    1.机器如何看图?

    2.如何帮助神经网络识别图像?

    3.定义卷积神经网络


    • 卷积层

    • 池化层

    • 输出层

    4.小结

    5.使用 CNN 分类图像

    1. 机器如何看图?

            人类大脑是一非常强大的机器,每秒内能看(捕捉)多张图,并在意识不到的情况下就完成了对这些图的处理。但机器并非如此。机器处理图像的第一步是理解,理解如何表达一张图像,进而读取图片。

           简单来说,每个图像都是一系列特定排序的图点(像素)。如果你改变像素的顺序或颜色,图像也随之改变。举个例子,存储并读取一张上面写着数字 4 的图像。

            基本上,机器会把图像打碎成像素矩阵,存储每个表示位置像素的颜色码。在下图的表示中,数值 1 是白色,256 是最深的绿色(为了简化,我们示例限制到了一种颜色)。




         一旦你以这种格式存储完图像信息,下一步就是让神经网络理解这种排序与模式。

    2. 如何帮助神经网络识别图像?

         表征像素的数值是以特定的方式排序的。




           假设我们尝试使用全连接网络识别图像,该如何做?

           全连接网络可以通过平化它,把图像当作一个数组,并把像素值当作预测图像中数值的特征。明确地说,让网络理解理解下面图中发生了什么,非常的艰难。




          即使人类也很难理解上图中表达的含义是数字 4。我们完全丢失了像素的空间排列。

         我们能做什么呢?可以尝试从原图像中提取特征,从而保留空间排列。

    案例 1

         这里我们使用一个权重乘以初始像素值。




            现在裸眼识别出这是「4」就变得更简单了。但把它交给全连接网络之前,还需要平整化(flatten) 它,要让我们能够保留图像的空间排列。



    案例 2

            现在我们可以看到,把图像平整化完全破坏了它的排列。我们需要想出一种方式在没有平整化的情况下把图片馈送给网络,并且还要保留空间排列特征,也就是需要馈送像素值的 2D/3D 排列。

           我们可以尝试一次采用图像的两个像素值,而非一个。这能给网络很好的洞见,观察邻近像素的特征。既然一次采用两个像素,那也就需要一次采用两个权重值了。


           希望你能注意到图像从之前的 4 列数值变成了 3 列。因为我们现在一次移用两个像素(在每次移动中像素被共享),图像变的更小了。虽然图像变小了,我们仍能在很大程度上理解这是「4」。而且,要意识到的一个重点是,我们采用的是两个连贯的水平像素,因此只会考虑水平的排列。

           这是我们从图像中提取特征的一种方式。我们可以看到左边和中间部分,但右边部分看起来不那么清楚。主要是因为两个问题:

    1. 图片角落左边和右边是权重相乘一次得到的。

    2. 左边仍旧保留,因为权重值高;右边因为略低的权重,有些丢失。

           现在我们有两个问题,需要两个解决方案。

    案例 3

          遇到的问题是图像左右两角只被权重通过一次。我们需要做的是让网络像考虑其他像素一样考虑角落。我们有一个简单的方法解决这一问题:把零放在权重运动的两边。


           你可以看到通过添加零,来自角落的信息被再训练。图像也变得更大。这可被用于我们不想要缩小图像的情况下。

    案例 4

           这里我们试图解决的问题是右侧角落更小的权重值正在降低像素值,因此使其难以被我们识别。我们所能做的是采取多个权重值并将其结合起来。

    (1,0.3) 的权重值给了我们一个输出表格



           同时表格 (0.1,5) 的权重值也将给我们一个输出表格。



             两张图像的结合版本将会给我们一个清晰的图片。因此,我们所做的是简单地使用多个权重而不是一个,从而再训练图像的更多信息。最终结果将是上述两张图像的一个结合版本。

    案例 5

          我们到现在通过使用权重,试图把水平像素(horizontal pixel)结合起来。但是大多数情况下我们需要在水平和垂直方向上保持空间布局。我们采取 2D 矩阵权重,把像素在水平和垂直方向上结合起来。同样,记住已经有了水平和垂直方向的权重运动,输出会在水平和垂直方向上低一个像素。



            特别感谢 Jeremy Howard 启发我创作了这些图像。

    因此我们做了什么?

            上面我们所做的事是试图通过使用图像的空间的安排从图像中提取特征。为了理解图像,理解像素如何安排对于一个网络极其重要。上面我们所做的也恰恰是一个卷积网络所做的。我们可以采用输入图像,定义权重矩阵,并且输入被卷积以从图像中提取特殊特征而无需损失其有关空间安排的信息。

             这个方法的另一个重大好处是它可以减少图像的参数数量。正如所见,卷积图像相比于原始图像有更少的像素。

    3.定义一个卷积神经网络

           我们需要三个基本的元素来定义一个基本的卷积网络 

    1. 卷积层

    2. 池化层(可选)

    3. 输出层

    卷积层

           在这一层中,实际所发生的就像我们在上述案例 5 中见到的一样。假设我们有一个 6*6 的图像。我们定义一个权值矩阵,用来从图像中提取一定的特征。


           我们把权值初始化成一个 3*3 的矩阵。这个权值现在应该与图像结合,所有的像素都被覆盖至少一次,从而来产生一个卷积化的输出。上述的 429,是通过计算权值矩阵和输入图像的 3*3 高亮部分以元素方式进行的乘积的值而得到的。



            现在 6*6 的图像转换成了 4*4 的图像。想象一下权值矩阵就像用来刷墙的刷子。首先在水平方向上用这个刷子进行刷墙,然后再向下移,对下一行进行水平粉刷。当权值矩阵沿着图像移动的时候,像素值再一次被使用。实际上,这样可以使参数在卷积神经网络中被共享。

    下面我们以一个真实图像为例。


           权值矩阵在图像里表现的像一个从原始图像矩阵中提取特定信息的过滤器。一个权值组合可能用来提取边缘(edge)信息,另一个可能是用来提取一个特定颜色,下一个就可能就是对不需要的噪点进行模糊化。

           先对权值进行学习,然后损失函数可以被最小化,类似于多层感知机(MLP)。因此需要通过对参数进行学习来从原始图像中提取信息,从而来帮助网络进行正确的预测。当我们有多个卷积层的时候,初始层往往提取较多的一般特征,随着网络结构变得更深,权值矩阵提取的特征越来越复杂,并且越来越适用于眼前的问题。

    步长(stride)和边界(padding)的概念

           像我们在上面看到的一样,过滤器或者说权值矩阵,在整个图像范围内一次移动一个像素。我们可以把它定义成一个超参数(hyperparameter),从而来表示我们想让权值矩阵在图像内如何移动。如果权值矩阵一次移动一个像素,我们称其步长为 1。下面我们看一下步长为 2 时的情况。


           你可以看见当我们增加步长值的时候,图像的规格持续变小。在输入图像四周填充 0 边界可以解决这个问题。我们也可以在高步长值的情况下在图像四周填加不只一层的 0 边界。


          我们可以看见在我们给图像填加一层 0 边界后,图像的原始形状是如何被保持的。由于输出图像和输入图像是大小相同的,所以这被称为 same padding。


           这就是 same padding(意味着我们仅考虑输入图像的有效像素)。中间的 4*4 像素是相同的。这里我们已经利用边界保留了更多信息,并且也已经保留了图像的原大小。

    多过滤与激活图

            需要记住的是权值的纵深维度(depth dimension)和输入图像的纵深维度是相同的。权值会延伸到输入图像的整个深度。因此,和一个单一权值矩阵进行卷积会产生一个单一纵深维度的卷积化输出。大多数情况下都不使用单一过滤器(权值矩阵),而是应用维度相同的多个过滤器。

            每一个过滤器的输出被堆叠在一起,形成卷积图像的纵深维度。假设我们有一个 32*32*3 的输入。我们使用 5*5*3,带有 valid padding 的 10 个过滤器。输出的维度将会是 28*28*10。

    如下图所示:


          激活图是卷积层的输出。

     池化层

           有时图像太大,我们需要减少训练参数的数量,它被要求在随后的卷积层之间周期性地引进池化层。池化的唯一目的是减少图像的空间大小。池化在每一个纵深维度上独自完成,因此图像的纵深保持不变。池化层的最常见形式是最大池化。


          在这里,我们把步幅定为 2,池化尺寸也为 2。最大化执行也应用在每个卷机输出的深度尺寸中。正如你所看到的,最大池化操作后,4*4 卷积的输出变成了 2*2。

          让我们看看最大池化在真实图片中的效果如何。



             正如你看到的,我们卷积了图像,并最大池化了它。最大池化图像仍然保留了汽车在街上的信息。如果你仔细观察的话,你会发现图像的尺寸已经减半。这可以很大程度上减少参数。

             同样,其他形式的池化也可以在系统中应用,如平均池化和 L2 规范池化。

    输出维度

            理解每个卷积层输入和输出的尺寸可能会有点难度。以下三点或许可以让你了解输出尺寸的问题。有三个超参数可以控制输出卷的大小。

    1. 过滤器数量-输出卷的深度与过滤器的数量成正比。请记住该如何堆叠每个过滤器的输出以形成激活映射。激活图的深度等于过滤器的数量。

    2. 步幅(Stride)-如果步幅是 1,那么我们处理图片的精细度就进入单像素级别了。更高的步幅意味着同时处理更多的像素,从而产生较小的输出量。

    3. 零填充(zero padding)-这有助于我们保留输入图像的尺寸。如果添加了单零填充,则单步幅过滤器的运动会保持在原图尺寸。


          我们可以应用一个简单的公式来计算输出尺寸。输出图像的空间尺寸可以计算为([W-F + 2P] / S)+1。在这里,W 是输入尺寸,F 是过滤器的尺寸,P 是填充数量,S 是步幅数字。假如我们有一张 32*32*3 的输入图像,我们使用 10 个尺寸为 3*3*3 的过滤器,单步幅和零填充。


           那么 W=32,F=3,P=0,S=1。输出深度等于应用的滤波器的数量,即 10,输出尺寸大小为 ([32-3+0]/1)+1 = 30。因此输出尺寸是 30*30*10。


    输出层

          在多层卷积和填充后,我们需要以类的形式输出。卷积和池化层只会提取特征,并减少原始图像带来的参数。然而,为了生成最终的输出,我们需要应用全连接层来生成一个等于我们需要的类的数量的输出。仅仅依靠卷积层是难以达到这个要求的。卷积层可以生成 3D 激活图,而我们只需要图像是否属于一个特定的类这样的内容。输出层具有类似分类交叉熵的损失函数,用于计算预测误差。一旦前向传播完成,反向传播就会开始更新权重与偏差,以减少误差和损失。

    4. 小结

          正如你所看到的,CNN 由不同的卷积层和池化层组成。让我们看看整个网络是什么样子:



    • 我们将输入图像传递到第一个卷积层中,卷积后以激活图形式输出。图片在卷积层中过滤后的特征会被输出,并传递下去。

    • 每个过滤器都会给出不同的特征,以帮助进行正确的类预测。因为我们需要保证图像大小的一致,所以我们使用同样的填充(零填充),否则填充会被使用,因为它可以帮助减少特征的数量。

    • 随后加入池化层进一步减少参数的数量。

    • 在预测最终提出前,数据会经过多个卷积和池化层的处理。卷积层会帮助提取特征,越深的卷积神经网络会提取越具体的特征,越浅的网络提取越浅显的特征。

    • 如前所述,CNN 中的输出层是全连接层,其中来自其他层的输入在这里被平化和发送,以便将输出转换为网络所需的参数。

    • 随后输出层会产生输出,这些信息会互相比较排除错误。损失函数是全连接输出层计算的均方根损失。随后我们会计算梯度错误。

    • 错误会进行反向传播,以不断改进过滤器(权重)和偏差值。

    • 一个训练周期由单次正向和反向传递完成。

    5. 在 KERAS 中使用 CNN 对图像进行分类

           让我们尝试一下,输入猫和狗的图片,让计算机识别它们。这是图像识别和分类的经典问题,机器在这里需要做的是看到图像,并理解猫与狗的不同外形特征。这些特征可以是外形轮廓,也可以是猫的胡须之类,卷积层会攫取这些特征。让我们把数据集拿来试验一下吧。


    以下这些图片均来自数据集。




           我们首先需要调整这些图像的大小,让它们形状相同。这是处理图像之前通常需要做的,因为在拍照时,让照下的图像都大小相同几乎不可能。


          为了简化理解,我们在这里只用一个卷积层和一个池化层。注意:在 CNN 的应用阶段,这种简单的情况是不会发生的。

    #import various packagesimport osimport numpy as npimport pandas as pdimport scipyimport sklearnimport kerasfrom keras.models import Sequentialimport cv2from skimage import io %matplotlib inline #Defining the File Path cat=os.listdir("/mnt/hdd/datasets/dogs_cats/train/cat") dog=os.listdir("/mnt/hdd/datasets/dogs_cats/train/dog") filepath="/mnt/hdd/datasets/dogs_cats/train/cat/"filepath2="/mnt/hdd/datasets/dogs_cats/train/dog/"#Loading the Images images=[] label = []for i in cat: image = scipy.misc.imread(filepath+i) images.append(image) label.append(0) #for cat imagesfor i in dog: image = scipy.misc.imread(filepath2+i) images.append(image) label.append(1) #for dog images #resizing all the imagesfor i in range(0,23000): images[i]=cv2.resize(images[i],(300,300)) #converting images to arrays images=np.array(images) label=np.array(label) # Defining the hyperparameters filters=10filtersize=(5,5) epochs =5batchsize=128input_shape=(300,300,3) #Converting the target variable to the required sizefrom keras.utils.np_utils import to_categorical label = to_categorical(label) #Defining the model model = Sequential() model.add(keras.layers.InputLayer(input_shape=input_shape)) model.add(keras.layers.convolutional.Conv2D(filters, filtersize, strides=(1, 1), padding='valid', data_format="channels_last", activation='relu')) model.add(keras.layers.MaxPooling2D(pool_size=(2, 2))) model.add(keras.layers.Flatten()) model.add(keras.layers.Dense(units=2, input_dim=50,activation='softmax')) model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) model.fit(images, label, epochs=epochs, batch_size=batchsize,validation_split=0.3) model.summary()

          在这一模型中,我只使用了单一卷积和池化层,可训练参数是 219,801。很好奇如果我在这种情况使用了 MLP 会有多少参数。通过增加更多的卷积和池化层,你可以进一步降低参数的数量。我们添加的卷积层越多,被提取的特征就会更具体和复杂。

           在该模型中,我只使用了一个卷积层和池化层,可训练参数量为 219,801。如果想知道使用 MLP 在这种情况下会得到多少,你可以通过加入更多卷积和池化层来减少参数的数量。越多的卷积层意味着提取出来的特征更加具体,更加复杂。

    结语

            希望本文能够让你认识卷积神经网络,这篇文章没有深入 CNN 的复杂数学原理。如果希望增进了解,你可以尝试构建自己的卷积神经网络,借此来了解它运行和预测的原理。

    原文链接:https://www.analyticsvidhya.com/blog/2017/06/architecture-of-convolutional-neural-networks-simplified-demystified/

    展开全文
  • 论文地址基于卷积神经网络图像语义分割浙江大学硕士论文图像分割:就是把感兴趣的内容从图像上分割出来,但是一般会对这个目标加上一定的语义信息,即语义标签,把加上语义的图像分割称为图像语义分割。...

    基于卷积神经网络的图像语义分割

    浙江大学硕士论文

    图像分割:就是把感兴趣的内容从图像上分割出来,但是一般会对这个目标加上一定的语义信息,即语义标签,把加上语义的图像分割称为图像语义分割。

     

    本文主要研究图像语义分割,并且以提升图像语义分割的准确性和他通用性为目标。

    1.分析了卷积神经网络在图像语义分割的应用前景,实现基于卷积神经网络和反卷积神经网络相结合的图像语义分割模型。

    2.对基于卷积神经网络和反卷积神经网络相结合的图像语义分割模型进行参数优化,通过在标准数据集上和其他算法进行对比实验,验证该模型语义分割的效果。

    3.将上述图像语义分割算法应用到医学图像分析领域,参加Kaggle左心室动力预测比赛,提升评分结果。

    4.将本文的图像语义分割算法应用到人体衣物分割,并不低于当前业界水平。

     

    第二章:相关工作

    2.1图像分割技术

    阈值分割、边缘检测、区域提取、特定理论工具

    2.2图像语义分割基础算法

    2.3应用

    人体衣物图像分割

    医学图像分析研究

    2.4图像分割流程


    将第三步替换为卷积神经网络用来提取特征。

    R-CNN:首先用选择查找的方式代替传统滑动窗口,提取出2000个候选区域;其次,对于每个区域,使用去掉最后一层Softmax层的AlexNet来提取特征,高达4096维的特征;然后对于每个类别都使用一个线性的SVM作为分类器,使用上一步提取出来的特征作为输出,得到每个区域属于某一类的得分;最后通过过滤舍弃部分的区域,通过増强算法得到识别物体的轮廓输出。

     

    但是这个过程还是太复杂,可以直接利用深度卷积神经网络对图像在像素级别进行分类。

     

    第三章:问题描述

    3.1图像语义分割,即对图像中重要的具有语义的部分进行分割,分割需要保证分割类型的准确性和轮廓的平整性,一般展示效果通过改变识别类的色彩来表示图像分割结果的不同语义。



    3.2实现难点

    对输入图片直接在像素水平上进行预测,避免了区域搜索,区域合并的过程。本文实现的算法采用卷积层和反卷积层相结合深度学习网络结构,是在16层VGG-net结构的基础上做镜像后得到的深度网络结构,从而将图片通过卷积神经网络的正过程的特征刻画,再在反卷积过程中将特征映射到原来的图片大小上实现图像语义分割。

     

    第四章:基于卷积神经网络的图像语义分割


    整个过程相较于传统基于区域特征的图像语义分割更加简洁有效,不需要前期的包含目标图像的区域搜索,也不需要在后期对去别家进行合并等操作。卷积和池化提取特征,缩小特征映射,通过反卷积和upooling层来进行逆向操作,将特征重新映射到原来的图像大小上。

     

    4.1卷积层和反卷积层

    在VGG-16的基础上去掉最后一层的Softmax层,可以生成热度图表征图片主要物体的轮廓。

     

     4.2防止过拟合和优化

    数据增强

    Dropout

    pre-training参数:预训练1000张图片,再用其参数进行全集训练


    BN:在每一层输入数据之前进行归一化操作,有利于模逃出局部最优解从而找到全局最优解

    模型融合

     

    第五章:基于CNN图像语义分割应用

    1.医学图像:

    https://www.kaggle.com/c/second-annual-data-science-bowl

    kaggle比赛都是这样,提供训练集和标签,但是测试集不提供标签。

    这里把图像分割作为数据处理的一部门了,拿到这个图像数据之后在进行卷积神经网络进行数据预测,加图像分割和不加图像分割之间相差如下图所示:

     



     2.穿衣搭配


    第六章:对比试验

    四种对比算法,实验采用预测的语义类别和正确的语义类别像素点的重合度

     

     



    展开全文
  • 卷积神经网络实现图像识别及过程可视化 本博文提供经典的卷积神经网络实现代码,将CNN的工具类等代码分别封装,并提供接口自行替换使用的模型(可以换成自己的神经网络及图片样本),代码中提供模型保存和读取...
  • 图像识别技术是信息时代的一门...简单分析了图像识别技术的引入、其技术原理以及模式识别等,之后介绍了神经网络的图像识别技术和非线性降维的图像识别技术及图像识别技术的应用。从中可以总结出图像处理技术的应用...
  • TensorFlow实战——卷积神经网络图像识别 经典的图像识别数据集 在图像识别领域里,经典数据集包括MNIST数据集、Cifar数据集和ImageNet数据集。 在处理上述这些数据集时,全连接神经网络往往无法很好的处理...
  • 1、kNN算法又称为k近邻分类(k-nearest neighbor classification)算法。 最简单平凡的分类器也许是那种死记硬背式的分类器,记住所有的训练数据,对于新的数据则直接和训练数据匹配,如果存在相同属性的训练数据,则...
  • 基于深度卷积神经网络图像分类摘要1 引言3 架构3.1 ReLU非线性3.2 多GPU训练3.4 重叠池化3.5 整体架构4 减少过拟合4.1 数据增强4.2 失活(Dropout)6 结果7 探讨 《ImageNet Classification with Deep Convolutional...
  • 需要原文的小伙伴可以加我qq:604395564联系,也欢迎做医学图像处理的小伙伴一起交流学习。自己写的,欢迎转载,但请注明出处哦^_^)     摘 要 医学图像分割是决定医学图像在临床诊疗中能否提供可靠依据的...
  • 对用于图像识别和分类的卷积神经网络架构作了深度揭秘
  • 相信很多人都对之前大名鼎鼎的 Prisma 早有...就是发表于 2016 CVPR 一篇文章,“ Image Style Transfer Using Convolutional Neural Networks”算法的流程图主要如下:总得来说,就是利用一个训练好的卷积神经网络 V
  • 在大一下学期我参加了格拉斯哥学院所开展的一系列新生研讨课活动,其中曾兵院长介绍了有关图像处理,三维电视和“可视”大数据,让我对我们日常的图像和视频有了全新的认识并激发了我对视频图像处理的兴趣。...
  • 博主设计的BP神经网络主要针对非线性畸变,核心思想是利用BP神经网络学习出原始图像和畸变图像对应坐标点之间的变化关系,即是利用神经网络拟合出对应坐标之间的映射关系(函数),然后利用图像插值的方法构造恢复...
  • 学习卷积神经网络一段时间了,记录下关于卷积神经网络图像卷积的原理。 1、人工神经网络 首先看下人工神经网络感知器的原理图,这个不是重点,但是卷积神经网络由此而来,所以截取材料如下:   类似wx + b的形式...
  • 《Convolutional Neural Networks for Large-Scale Remote-Sensing Image Classification》本文提出了一种全卷积神经网络来产生密集分类(逐像素分类),特点是:位置无关、输出是一系列卷积层的结果。首先将负责...
  • 全卷积神经网络是基于卷积神经网络的改进,使得输入和输出的尺寸一致,并且对每个像素点进行分类,达到图像分割的目的。下图是全卷积神经网络的流程图。其中第一行是提取特征步骤,然后2X conv7和4X conv7分别表示对...
1 2 3 4 5 ... 20
收藏数 52,478
精华内容 20,991