★tensorflow中“卷积”的深度解析

2024-05-13

1. ★tensorflow中“卷积”的深度解析

  (1)单个独立卷积核的通道数=输入图像的通道数(输入图像决定);   (2)独立卷积核的个数=输出图像的通道数(用户决定)。 
   在描述卷积核时,“ 卷积核通道数 ”这个概念必须搞清楚,是指“ 单个独立卷积核的通道数 ”,还是指 独立卷积核的个数(输出通道数) 。   例:   假如输入图像的规模为 32×32×128 ,即输入通道数为128;   那么根据前面(1)可知单个卷积核的通道数也是128,即卷积核尺寸应该为: n×n×128 (n通常为3、5、7等)。   假如用256个这样的卷积核对输入进行卷积,则最后得到的输出图像尺寸为(根据前面(2)): (32-n+1)×(32-n+1)×256 ,即输出图像有256个通道(一个卷积核得到一个输出结果,也就是一个通道,相当于把原来只有128层的图像,扩展到了256层)。   可见,本次所有卷积核尺寸(或者说卷积核的总参数个数)是: n×n×128×256    需要注意的是, 很多时候在描述卷积核时,通常会忽略单个卷积核的通道数,而保留了卷积核个数 ,如上面的总卷积核简写为: n×n×256 ,省略了128,这么写是有道理的,因为这4个参数中128这个参数是由输入图像的通道数决定的,而其他三个参数则是由用户决定的。   因此在解读卷积核尺寸时,必须搞清楚,第三个参数是输入通道数还是卷积核个数。判断标准就是前面的(1)和(2)两点结论。
    图片通道channel :通常jpg等彩色图片由R、G、B三个图层构成,每个图层实际上就是一个二维矩阵,也就是所谓的一个通道,因此一个彩色图片通常有3个通道,而一个黑白图片就只有一个通道。   tensorfllow中的“输入通道in_channels”:输入图像的通道数。   tensorfllow中的“输出通道out_channels”:输出图像的通道数。
   最初输入的图片样本的 channels ,取决于图片类型,比如RGB;   卷积操作完成后输出的 out_channels ,取决于卷积核的数量。此时的 out_channels 也会作为下一次卷积时的卷积核的 in_channels;   卷积核中的 in_channels ,就是上一次卷积的 out_channels ,如果是第一次做卷积,就是输入本图片的 channels 。
   tf.nn.conv2d()是TensorFlow里面实现卷积的函数,其调用方式如下:
   下图展示了对一张3通道jpeg图片进行两次连续卷积操作的过程:
                                                                                                                                                                   输出结果:
                                            https://www.cnblogs.com/welhzh/p/6607581.html     https://www.jianshu.com/p/abb7d9b82e2a     https://www.imooc.com/article/details/id/29525     https://cloud.tencent.com/developer/article/1341522     https://www.cnblogs.com/billux/p/9072173.html 

★tensorflow中“卷积”的深度解析

2. 卷积神经网络CNN(Convolutional Neural Network)

 上图计算过程为,首先我们可以将右边进行卷积的可以称为过滤器也可以叫做核,覆盖到左边第一个区域,然后分别按照对应位置相乘再相加,3*1+1*1+2*1+0*0+0*0+0*0+1*(-1)+8*(-1)+2*(-1)=-5;   按照上述的计算方法逐步按右移一个步长(步长可以设定为1,2,...等),然后按往下移,逐渐计算相应的值,得出最终的值。
                                           如上图显示,对于第一个图像矩阵对应的图,一边是白色,一边是黑色,那么中间就会存在一个垂直的边缘,我们可以选择一个垂直边缘检测过滤器,如乘法右边的矩阵,那么两者做卷积后得出的图会显示如等号右边的结果矩阵对应的灰度图中间会有一个白色的中间带,也就是检测出来的边缘,那为什么感觉中间边缘带会比较宽呢?而不是很细的一个局域呢?原因是我们输入的图像只有6*6,过于小了,如果我们选择输出更大的尺寸的图,那么结果来说就是相对的一个细的边缘检测带,也就将我们的垂直边缘特征提取出来了。   上述都是人工选择过滤器的参数,随着神经网络的发展我们可以利用反向传播算法来学习过滤器的参数
                                           我们可以将卷积的顾虑器的数值变成一个参数,通过反向传播算法去学习,这样学到的过滤器或者说卷积核就能够识别到很多的特征,而不是依靠手工选择过滤器。
   - padding 操作,卷积经常会出现两个问题:   1.每经过一次卷积图像都会缩小,如果卷积层很多的话,后面的图像就缩的很小了;   2.边缘像素利用次数只有一次,很明显少于位于中间的像素,因此会损失边缘图像信息。   为了解决上述的问题,我们可以在图像边缘填充像素,也就是 padding 操作了。   
                                           
   如果我们设置在图像边缘填充的像素数为p,那么经过卷积后的图像是:(n+2p-f+1)x(n+2p-f+1).    如何去选择p呢    通常有两种选择:   -Valid:也就是说不填充操作(no padding),因此如果我们有nxn的图像,fxf的过滤器,那么我们进行卷积nxn fxf=(n-f+1)x(n-f+1)的输出图像;   -Same:也就是填充后是输出图像的大小的与输入相同,同样就有(n+2p)x(n+2p) fxf=nxn,那么可以算,n+2p-f+1=n,得到p=(f-1)/2。   通常对于过滤器的选择有一个默认的准则就是选择过滤器的尺寸是奇数的过滤器。   - 卷积步长设置(Strided COnvolution)    卷积步长也就是我们进行卷积操作时,过滤器每次移动的步长,上面我们介绍的卷积操作步长默认都是1,也就是说每次移动过滤器时我们是向右移动一格,或者向下移动一格。   但是我们可以对卷积进行步长的设置,也就是我们能够对卷积移动的格数进行设置。同样假如我们的图像是nxn,过滤器是fxf,padding设置是p,步长strided设置为s,那么我们进行卷积操作后输出的图像为((n+2p-f)/s+1)x((n+2p-f)/s+1),那么这样就会出现一个问题,如果计算结果不是整数怎么办?   
                                           
   一般是选择向下取整,也就是说明,只有当我们的过滤器完全在图像上能够覆盖时才对它进行计算,这是一个惯例。    实际上上述所述的操作在严格数学角度来说不是卷积的定义,卷积的定义上我们计算的时候在移动步长之前也就是对应元素相乘之前是需要对卷积核或者说我们的过滤器进行镜像操作的,经过镜像操作后再把对应元素进行相乘这才是严格意义上的卷积操作,在数学角度上来说这个操作不算严格的卷积操作应该是属于互相关操作,但是在深度学习领域中,大家按照惯例都省略了反转操作,也把这个操作叫做卷积操作 
   我们知道彩色图像有RGB三个通道,因此对于输入来说是一个三维的输入,那么对三维输入的图像如何进行卷积操作呢?
                                           例子,如上图我们输入图像假设为6×6×3,3代表有RGB三个通道channel,或者可以叫depth深度,过滤器的选择为3×3×3,其中需要规定的是,顾虑器的channel必须与输入图像的channel相同,长宽没有限制,那么计算过程是,我们将过滤器的立体覆盖在输入,这样对应的27个数对应相乘后相加得到一个数,对应到我们的输出,因此这样的方式进行卷积后我们得出的输出层为4×4×1。如果我们有多个过滤器,比如我们分别用两个过滤器一个提取垂直特征,一个提取水平特征,那么输出图4×4×2 。也就是代表我们输出的深度或者说通道与过滤器的个数是相等的。
                                           第l层的卷积标记如下:
                                           加入我们的过滤器是3×3×3规格的,如果我们设定10个过滤器,那么需要学习的参数总数为每个过滤器为27个参数然后加上一个偏差bias那么每个过滤器的参数为28个,所以十个过滤器的参数为280个。从这里也就可以看出,不管我们输入的图片大小是多大,我们都只需要计算这些参数,因此参数共享也就很容易理解了。
                                           
                                           
   为了缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性,我们经常会使用池化层。池化层的计算方式与卷积类似,只是我们需要对每一个通道都进行池化操作。   池化的方式一般有两种:Max Pooling和Average Pooling。
                                           上面为Max Pooling,那么计算方法与卷积类似,首先设定超参数比如过滤器的大小与步长,然后覆盖到对应格子上面,用最大值取代其值作为输出的结果,例如上图为过滤器选择2×2,步长选择为2,因此输出就是2×2的维度,每个输出格子都是过滤器对应维度上输入的最大值。如果为平均池化,那么就是选择其间的平均值作为输出的值。   因此从上面的过程我们看到,通过池化操作能够缩小模型,同时能让特征值更加明显,也就提高了提取特征的鲁棒性。
最新文章
热门文章
推荐阅读