zoukankan      html  css  js  c++  java
  • 卷积神经网络

    边缘检测示例

    给一张图片让电脑 去搞清楚,这张照片里有什么物体,你可能做的第一件事是检测图片中的垂直边缘,比如说在这张图片中的栏杆就对应垂直线,与此同时这些行人的轮廓线某种程度中也是垂线这些线是垂直边缘检测器的输出 。

    你可能也想检测水平边缘,比如说这些栏杆就是很明显的水平线它们也能被检测到,结果 在这。如何在图像中检测这些边缘,看一个例子

    这是一个6*6的灰度图像,它是6*6*1的矩阵,而不是6*6*3的。因为并没有RGB的三通道,为了检测图像中的垂直边缘,你可以构造一个3*3的矩阵。在共用习惯中,在卷积神经网络的术语中,它被称为过滤器,我要构造一个3*3的过滤器

    对于这个6*6的图像进行卷积运算,用*来表示

    用3*3的过滤器对其进行卷积。星号就是对卷积的标准标志

    左边这张图可以被理解成一张图片,中间的这个被理解 成为过滤器,右边的矩阵可以理解为另一张图片。这个就是垂直边缘检测器

    在python代码不是用星号来表示 卷积,我们会使用一个叫conv_forward的函数。如果在tensorflow下,这个函数叫tf.nn.conv2d

    更多边缘检测的内容

    我们还需要学习区分下边和负边,实际上就是由亮到暗与由暗到亮的区别。也就是边缘的过渡。我们还能了解到其他类型的边缘检测以及如何实现这些算法

    这张6*6的图片左边较亮,而右边较暗,将它与垂直边缘检测滤波器进行卷积,检测结果就显示在了右边这幅图的中间部分。

    现在,这张图片,它的颜色被翻转

     进行卷积最后得到的图中间会是-30,而不是30,转换为图片就是这样的

     中间的过渡部分被翻转了,之前的30翻转成了-30。表明这是由暗向亮过渡。

    再看一个例子,这是一个3*3的滤波器,它可以检测出垂直的边缘,右图可以检测出水平的边缘

    padding

    为了构建深度神经网络,我们还需要学习一个基本的卷积操作,padding

    如果我们有一个n*n的图像,用一个f*f的过滤器做卷积,那么输出结果的维度就是(n-f+1)*(n-f+1),这个有两个缺点,一个是每次做卷积操作你的图像就会缩小,经过几次卷积后,可能就会变得非常小;第二个缺点就是如果你注意角落边的像素,这个像素点只被一个输出所触碰或者说使用,但是如果是在中间的像素点就会有许多区域与之重叠,所以那些在角落或者边缘区域的像素点在输出中采用较少,意味着你丢掉了图像边缘位置的许多信息

    为了解决这些问题,在卷积操作之前,填充这幅图像。按这个例子来的话,你可以再给它填充一层像素,这样最后得到的还是6*6的图片

    卷积步长

     目前步幅是2,我们要移动两个位置

     

     单层卷积网络

     假设使用第一个过滤器得到一个4*4的矩阵,使用第二个过滤器得到另一个4*4的矩阵。最终各自形成一个卷积神经网络层,然后增加偏差,通过python的广播机制给这16个元素都加上同一偏差,然后应用非线性函数为了说明它是一个非线性激活函数ReLU,输出结果是一个4*4矩阵。第二个亦是如此

    之后重复此步骤,把这两个矩阵堆叠起来,最终得到一个4*4*2的矩阵,它是卷积神经网络的一层

     若第层都是一个3*3*3的图像,因此每个过滤器有27个参数然后加上一个偏差用参数b表示现在参数增加到28个,现在有10个过滤器,加在一起是28*10个参数 ,无论输入的图片有多大,参数始终是280个。用这10个过滤器来提取特征,如垂直边缘,水平边缘和其它特征,即使这些图片很大,参数却很少。这就是卷积神经网络的一个特征叫作避免过拟合

    最后总结一下用于描述卷积神经网络中的一层也就是卷积层的各种标记

    这一层是卷积层,用f[l]表示过滤器大小。我们说过过滤器大小为f*f,上标[l]表示层中过滤器大小为f*f,通常情况下,上标[l]用来标记层。

    这个用来标记padding的数量

    它用来表示卷积的步幅

    这一层的输入会是某个维度的数据,表示为n*n*nc(再乘以上一层的通道数量)

    第l层图片大小为 

      

    l层的输入就是上一层的输出,因此上标要用[-1],神经网络中这一层会有输出它本身会输出图像,其大小为

     

    在这个新表达式中,l层输出图像的大小是上一层的维度数据加上l层的padding,再减去l层中过滤器的大小等等。我们可以通过这种方式得到输出图片的高度。这样我们便能计算输出 图像的高度或宽度

     它等于该层中过滤器的数量,如果数量是2,则输出图像就是4*4*2,它是二维的。输出图像中的通道数量就是神经网络中这一层所使用的过滤器的数量 

    如何确定过滤器的数量,

     

    如何确定权重参数W,过滤器维度已知。它等于

     池化层

    除了卷积层,卷积网络也经常使用池化层来缩减模型的大小,提高计算速度。

    先举个例子,假如输入是一个4*4矩阵用到的池化类型是最大池化,执行最大池化的输出是一个2*2矩阵。把4*4的输入拆分成不同的区域,对于2*2的输出,输出的每个元素都是其对应颜色区域中的最大元素值

     现在有一个输入是5*5的矩阵,我们采用最大池化法,它的过滤器参数为3*3,即f=3,s=1

    输出矩阵是3*3,这个公式也可以计算最大池化的输出 大小。此例是计算3*3输出的每个元素。

    取最大值在这个3*3矩阵里。 

    计算最大池化的方法就是分别对每个信道执行刚刚的计算过程,如图上所示,第一个信道依然保持不变,第二个信道,在这个卷层做同样的计算。

    卷积神经网络示例

    假设有一张大小为32*32*3的输入图片,这是一张RGB模式的图片,你想做手写体数字识别,32*32的RGB图片中含有某个数字,比如7。你想识别它是从0-9这10个数字中的哪一个。

    输入是一个32*32*3的矩阵,假设第一层使用的过滤器大小为5*5步幅是1,padding是0,过滤个数是6,那么输出为28*28*6,然后构建一个池化层,使用最大池化算法,参数f=2,s=2,padding=0。最大池化使用的过滤器为2*2,步幅为2。表示层的高度和宽度会减少一半,因此28*28变成了14*14,最终 输出 为14*14*6。

    卷积有两种分类,这与所谓层的划分存在一致性。一类卷积是一个卷积层和一个池化层作为一层,这就是神经网络的Layer1;另一类卷积是把卷积层作为一层,池化层单独作为一层。

    得到输出是14*14*6,我们再为它构建一个卷积层,过滤器大小为5*5步幅 为1,这次使用10个过滤器,最后输出一个10*10*10的矩阵,标记为COVN2,然后做最大池化,最后输出为5*5*10

     现在我们将pool2平整化为一个大小为400的一维向量,我们可以把平整化结果想象成像这样一个神经元集合,然后利用这400个单元构建下一层,下一层含有120个单元,这就是我们第一个全连接层,标记为FC3。这400个单元与120个单元紧密相连,这就是全连接层

    假如它含有84个单元,用这84个单元填充一个softmax单元,我们想通过手写数字识别来识别手写的0-9这10个数字,softmax就会有10个输出。

    随着神经网络深度的加深高度nH和宽度nW通常都会减少,而信道数量会增加。从3到6到16不断增加,然后得到一个全连接层

  • 相关阅读:
    SpringBoot 日志
    springboot 自动配置
    性能测试步骤
    性能测试与压力测试
    Shell学习八:调用其它shell文件
    Shell学习七:重定向
    Linux mysql服务重启
    Shell学习六:流程控制
    Shell学习五:test参数的使用
    Shell学习四:echo和print输出
  • 原文地址:https://www.cnblogs.com/awsole/p/15076106.html
Copyright © 2011-2022 走看看