卷积神经网络

数字图像基础

说卷积神经网络之前需要说一下数字图像,因为CNN主要就是处理图像的。在CNN研究的图像中,绝大多数都是位图而不是矢量图。位图是由一个个像素点表示的,我们知道计算机是二进制,那么一个像素是由多少位表示这叫图像的深度。

图像根据通道或者颜色可以分为灰度图像和彩色图像。灰度图像只有一个通道,图像颜色只有由白到灰再到黑。

对于一个深度为8的灰度图像而言,一个像素用8bit存储,那么一个像素最多能表示2的8次方共256种颜色,其中0是黑色,255是白色,中间都是灰色。灰度只需要用一个数值来表示就ok了,因此灰度图像是单通道。

对于彩色图像而言,一般来说颜色空间是RGB,如果仍然深度为8,那么一个像素需要用三个数值来表示,就是三通道,有的还会有第四个通道alpha,表示透明度。如果不考虑透明度,R,G,B通道分别可以表示256种颜色,那么一个像素最多有256的3次方种颜色。

对于我们来说这幅图片是一副图片,对于计算机来说,一幅图片是一个一个像素点组成,每一个像素点又是数值。来看个例子。

import cv2
def main():
    img = cv2.imread("../samples/files/1.jpg")
    print("图像的shape信息:",img.shape)
    print(img)
    cv2.imshow("鲁班七号",img)
    cv2.waitKey()
if __name__ == "__main__":
    main()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看到,可爱的鲁班在计算机中的表示,shape=(1080,1920,3)表明height=1080px,width=1920px,depth=3通道,数据是一个个数字,因为每个像素是三通道,因此一个像素是一个数组表示,因此我们的小鲁班是一个1920*1080的二维数组,二维数组的元素是一个长度为3的数组,分别表示BGR通道的数值。

那么灰度图像是什么样的呢?我们把小鲁班变成灰度图像。

import cv2

def main():
    img = cv2.imread("../samples/files/1.jpg",0)
    print("图像的shape信息:",img.shape)
    print(img)
    cv2.imshow("鲁班七号",img)
    cv2.waitKey()

if __name__ == "__main__":
    main()

在这里插入图片描述
在这里插入图片描述
可以看到shape中已经没有第三个字段了,表明是一个通道,每一个像素点就是一个数值,灰度图像的小鲁班是1920*1080的二维数组,二维数组的元素是灰度值。

CNN vs DNN

为啥在图像领域要用CNN不用传统神经网络呢?因为用传统的神经网络不合适,图像是由一个个像素点组成的,对于彩色图像,每个像素点有三个通道,分别表示RGB的颜色,那么如果一个图像是尺寸是(28,28,1),表示这个图像是一个长度和宽度是28,深度为1的图像(深度也叫通道数,1表示灰度图像)。

如果使用全连接神经网络,假设隐藏层有15个神经元。那么输入的数据是1784的向量,这一列列向量与15个神经云相连,那么有78415=11760个w,输出的是115的向量,所以还需要15个偏置项b,然后和输出层10个神经元相连,所以1176010=117600个权重w,在加上偏置项10个一共117625个参数。这样参数太多了,随便进行一次反向传播计算量都是巨大的。

CNN

卷积

上文提到我们用传统的三层神经网络需要大量的参数,原因在于每个神经元都和相邻层的神经元相连接,但是思考一下,这种连接方式是必须的吗?全连接层的方式对于图像数据来说似乎显得不这么友好,因为图像本身具有“二维空间特征”,通俗点说就是局部特性。譬如我们看一张猫的图片,可能看到猫的眼镜或者嘴巴就知道这是张猫片,而不需要说每个部分都看完了才知道,啊,原来这个是猫啊。所以如果我们可以用某种方式对一张图片的某个典型特征识别,那么这张图片的类别也就知道了。这个时候就产生了卷积的概念。举个例子,现在有一个4*4的图像,我们设计两个卷积核,看看运用卷积核后图片会变成什么样。

在这里插入图片描述由上图可以看到,原始图片是一张灰度图片,每个位置表示的是像素值,0表示白色,1表示黑色,(0,1)区间的数值表示灰色。对于这个44的图像,我们采用两个22的卷积核来计算。设定步长为1,即每次以2*2的固定窗口往右滑动一个单位。以第一个卷积核filter1为例,计算过程如下:

1 feature_map1(1,1) = 1*1 + 0*(-1) + 1*1 + 1*(-1) = 1 
2 feature_map1(1,2) = 0*1 + 1*(-1) + 1*1 + 1*(-1) = -1 
3 ```
4 feature_map1(3,3) = 1*1 + 0*(-1) + 1*1 + 0*(-1) = 2

可以看到这就是最简单的内积公式。feature_map1(1,1)表示在通过第一个卷积核计算完后得到的feature_map的第一行第一列的值,随着卷积核的窗口不断的滑动,我们可以计算出一个3*3的feature_map1;同理可以计算通过第二个卷积核进行卷积运算后的feature_map2,那么这一层卷积操作就完成了。

在上面,通过一个22的卷积核来对44的图像进行滤波,得到了33的图像,假设输入图像大小是NN,卷积核是f*f,假设步长为1,那么输出图像大小是(n-f+1)(n-f+1)

卷积核是个什么东西,卷积又是什么东西,我的理解卷积核是一种维度,经过卷积核得到的图像就是在这个维度上的特征,卷积多次就是在这个维度上更深层次的特征。

举个例子,描述一个人,可以从性别、肤色、所在地区等等来描述,卷积核就代表这些特征维度;经过卷积得到的图像就类似于男(在性别维度上的特征),白肤色(肤色维度的特征),亚洲中国(地区上的特征);多次卷积就类似于,地区这个维度可以回答亚洲,还可以回答中国,北京市等等,越来越精确。总之卷积就是为了提取特征。

这样做卷积运算的缺点是,卷积图像的大小会不断缩小,另外图像的边缘像素只能使用一部分卷积核,这意味着丢掉了很多图像边缘的信息,为了解决这个问题,引入了padding操作。也就是在图像做卷积操作之前,沿着图像边缘用0进行填充。

padding

还是上面的图,如果padding=1,就变成下面的操作了
在这里插入图片描述把44的图片沿着边缘填充一(因为padding=1)个0,变成了66的图片,在进行卷积操作,卷积核是22,步长假设还是1,那么得到的结果(6-2+1)(6-2+1) = 4*4,就和原始输入图像一样大。

因此,假设输入图像是nn的,卷积核是ff的,padding=p,则输出图像是(n+2p-f+1)*(n+2p-f+1)

padding有两种模式:Valid(不填充),Same(输出图像和输入图像一样大)

卷积步长stride

上面的卷积都是一个步长,也就是说窗口每次只移动一个像素,如果卷积步长为2,卷积运算过程为:
在这里插入图片描述在这里插入图片描述在这里插入图片描述因此,假设输入图像是nn的,卷积核是ff的,padding=p,stride=s,则输出图像长宽是[(n+2p-f)/s] + 1

彩色图像的卷积

以上说的是灰度图像的卷积,我们知道彩色图像是RGB三个通道的,所以卷积核不能是简简单单的33这种的了,得变成333,最后的数字表示通道数(channels),运算方法和灰度图像是一样的,只是每个通道单独做卷积在累加。
在这里插入图片描述另外一个问题是,如果我们在不仅仅在图像总检测一种类型的特征,而是要同时检测垂直边缘、水平边缘、45度边缘等等,也就是多个卷积核的问题。如果有两个卷积核,最终生成图像为4
42的立方体,这里的2来源于我们采用了两个卷积核。如果有10个卷积核那么输出图像就是44*10的立方体。

在这里插入图片描述
上面说到DNN的参数太多了,那CNN呢?假设有10个卷积核,一个过滤器有333=27个权重,再加一个bias,共28个,那么10个才280个。

在这里插入图片描述那CNN是啥样的呢?

输入图像:39*39*3

第一层:卷积核:3*3,步长:1,padding:0,卷积核个数n=10
经过第一层输出图像是:长宽都是(39-3+1)=37,通道数是10,因为第一层有10个卷积核,因此图像是37*37*10的

第二层:卷积核:5*5,步长:2,padding:0,卷积核个数n=20
经过第二层输出图像是:长宽都是[(37-5)/2]+1)=17,通道数是20,因此17*17*20

第三层:卷积核:5*5,步长:2,padding:0,卷积核个数n=40
经过第三层输出图像是:长宽都是[(17-5)/2]+1)=7,通道数是40,因此7*7*40

再将输出结果送到softmax或者logistic中,进行分类。

池化

池化是一种卷积的简化方案,可以理解为一种特殊的卷积,分为最大池化和平均池化,

最大池化,假设选择22的卷积核,步长为2,计算过程如下:
在这里插入图片描述以下是一个过滤器大小为3
3,步长为1的池化过程,具体计算和上面相同,最大池化中输出图像的大小计算方式和卷积网络中计算方法一致,如果有多个通道需要做池化操作,那么就分通道计算池化操作。
在这里插入图片描述平均池化:它计算的是区域内的平均值而最大池化计算的是最大值。在日常应用使用最多的还是最大池化
在这里插入图片描述

参考博客:https://blog.csdn.net/ice_actor/article/details/78648780

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值