一 全连接网络所遇到的问题
对于一个大小为28*28像素的图片来说,将他的二维向量铺平一维输入神经网络中,它就拥有784个特征,那么以该特征随意建立个神经网络模型,其示意图如下:
由于输入节点和输出节点是两两相连的关系,使得参数稠密,计算代价高,这使得全网络连接在应用上有很大的局限性。
二 什么是卷积神经网络
卷积神经网络的核心思想就是局部相关性与权值共享。
1.什么是局部相关性?
对于一个图片来说,在一定范围内的区域,其像素值都是具有相关性的,所以就有了感受野的概念,以一个大小为33的感受野为例,在感受野范围内的像素值彼此具有很大的关联性,和感受野范围外的像素值并无很大的相关关系。将感受野换算到在上图的神经网络模型构建中,感受野指的就是在784个输入节点中,固定区域内的输入节点之间相关性强,和区域外的输入节点关系较弱,甚至是没关系,这就意味着一个输出节点没有必要和所有的输入节点相连,只需要和数目为33的输入节点相连即可,因此全连接层原有的784256个参数可以直接减少到33*256个,这就是局部相关性。
2.什么是权重共享?
学者们为了能够在局部相关性的基础上进一步减少参数量,认为上述的每个输出节点的参数都是一样的,即不同节点的感受野的参数是一样的,这使得33256参数量直接变成了256个,每个输出节点用的权重矩阵都是相同的,只是和不同的输入节点相连接罢了。
3.实质
卷积神经网络本质上是从节点的连接方式与节点之间参数这两个角度入手,来减少网络层的参数,该思想考虑了图片本身的特点,因此在实践上得以广泛的运行。
三 卷积神经网络该如何计算
以shape为[b,h,w,c]的张量X为例,其各个维度含义的顺序以此为:图片数量,高度,宽度和RGB通道数。卷积核指的是大小为感受野的权重矩阵。
1. 单通道单卷积核
单通道指的张量X的c为1时的情况,单卷积核指的是只有一个权重矩阵。那么当单通道输入网络结构时,其计算方式如下:
步骤1 :计算,取值
步骤2:移动步长s=1的距离,计算
步骤3:换行,计算
步骤4: 计算出全部
需要注意的是,感受野在移动过程中的步长s为一个单位,使得大小55的图片像素值矩阵经过卷积以后变成了33大小的矩阵。
2. 多通道输入和单卷积核
计算结构:
可以看出,当3个通道输入的时,单卷积核的通道数也变成了3个。因为是一个单卷积核进行计算,所以最后只能得到一个输出矩阵。一般来说,一个卷积核只能完成某种逻辑的特征提取。
步骤1:计算与累加
步骤2:以步长s=1的距离移动,计算与累加
步骤3:换行,计算与累加,直至全部计算完毕
** 3. 多通道输入,多卷积核**
每个卷积核的大小、步长、填充设定等都是统一设置, 这样才能保证输出的每个通道大小一致,从而满足拼接的条件,计算结构图如下:
四 卷积神经网络的输出
通过上一节的的计算流程可看出,卷积神经层的输出尺寸与感受野的大小k,卷积核的数目c与移动步长s密切相关。一般来说,卷积神经层的输出尺寸均小于卷积神经层的输入尺寸,如果想让卷积神经层的输出尺寸和输入尺寸保持一致,那么就要用到填充操作。
什么是填充?
将左图的原始输入矩阵进行上、下方向各填充 1 行, 左、右方向各填充2列,得到新的输入矩阵。
如何计算?
以原始输入矩阵进行上、下方向各填充 1 行, 左、右方向各填充 1列,得到新的输入矩阵为例子,与感受野的权重计算过程如下:
五 卷积神经网络的实现
1.手动实现
在 TensorFlow中, 通过 tf.nn.conv2d 函数可以方便地实现 2D 卷积运算。
输入张量X为[b,h,w,c_in],卷积核W为[k,k,c_in,c_out],则输出O为[b,h1,w1,c_out]。
import tensorflow as tf
x = tf.random.normal([2, 5, 5, 3]) # [b,h,w,cin]
w = tf.random.normal([3, 3,