惯例,还是分享一句歌词呢。
《诗话小镇》
岁月如流沙苍老了风华
那誓言未长大
流年斑驳眉心朱砂
你画上哪个她
繁华褪尽薄了红纱
约定符号:
- 输入图像:
- 过滤器:
- paddig(填充):
-
stride(步长):
padding
1. padding概念引入
当使用一个的过滤器对的图像进行卷积操作后,会得到的输出图像。
此时输出图像大小为:
但是这样会带来两个缺点:
- 图像会越来越小
- 如上图,原图像左上角绿色区域纸杯一个过滤器使用,而中间红色区域会被多个过滤器使用,这就意味着边缘信息的丢失
为此引入padding(填充)的操作,即在卷积操作之前,先在图像边缘进行像素填充,像素值可以是0也可以是图像边缘像素,填充宽度为p,例如在上图中使用像素0对图像边缘填充,宽度p=1,此时输出图像和输入图像维度相等,并且图像左上角的像素被多个过滤器使用,边缘信息丢失的更少。
此时,输出图像的维度为:
2. padding填充模式
-
padding=’VALID’
此时,即不填充, 输出图像为
-
padding=’SAME’
此时输入和输出图像维度相同,此时:
因为注意: 一般 为奇数,主要有两个好处:
- p可以取整数
- 奇数过滤器有一个中点,也称锚点(anchor),便于确认过滤器的位置
stride (卷积步长)
不同于之前一次想左移动一格,此时向左移动两格,
同样的,也是向下移动两格
最终的输出图像大小为
假设stride移动步长为s,则最后的输出图像为:
其中, 为向下取整
比如上图中:
GRB多通道图像的卷积
比如在,过滤器的大小不在是而是,最后的3对应为通道数(channels)。
卷积过程:比如第一个与R通道卷积,会得到一个数,同理,第二个与G通道卷积,第三个与B通道卷积,然后将三个数累加,作为的左上角第一个位置值,接下来依次在图像上滑动,最终得到的输出。
我们肯定不能只在图像中检测一种特征,而是同时要检测水平,垂直,45度边缘等特征,此时就要使用多个过滤器了。假设我们使用两个过滤器,最终的输出为,这里的2是使用两过滤器的结果,同样,若是使用5个过滤器呢?输出结果就是了。下面是计算的例子:
单层卷积
上一节,得到两个的矩阵,通过python的广播机制在两个矩阵上加入偏差bias,然后经过非线性函数relu,即可得到单层卷积网络的输出。
图示如下:
公示表示如下:
式子中标识第层的输出,标识第层的过滤器,标识第层的偏差
下面是动态计算的例子,跑的有点快,得计算一下,
比如:输出O[:,:,0]的左上角第一个值:
本系列课程的符号约束
-
过滤器需要四个参数确定:
其中,通道数与上一层图像输入的通道数相同,过滤器个数与本层输出图像的通道数相同。这一部分在下面的例子中会有深刻体现,并且在tensorflow函数调用中要明确指明的参数。 -
符号约定
对于第层神经网络层:- :第层过滤器大小,
- :第层填充数量
- : 第层步长大小
: 过滤器的个数
-
input:
:层输入图像的高宽以及通道数
-
output:
: 输出图像的高、宽以及通道数
- 输出图像的大小:
- 输出图像通道数就是过滤器个数:
将输出的图像加上Bias然后经过非线性函数Relu即可完成一层卷积神经网络的构建了。
简单卷积神经网络实例
建议在此部分自己找张纸推导一遍,我当时跟着课程推导了两三个网络实例。
最后将第三层的输出通过softmax或logistic来进行相应的操作
在这个网络结构中,有两个参数的变化值得注意:
- 图像宽度变化
- 图像通道数变化
图像宽度逐层减半而图像通道逐层增加,关于这些超参数的确定,后边会给出一些建议