机器学习也是刚刚入门,虽然对卷积、池化等过程很熟悉,但是一直不太清楚具体的计算,幸好在博文上看到了讲解过程,看完以后受益匪浅,然后自己又重新写了一遍。有这个表格,再也不用烦恼卷积的计算了。
原文地址:https://blog.csdn.net/dcrmg/article/details/79652487
输入矩阵:四个维度:[16,480,640,3] [batch,Height,Width,InDepth],依次是:图片数、高度、宽度、图像通道数。(16张图像,每张图像是高480宽640分辨率,通道是RGB通道)
输出矩阵:和输入矩阵的维度顺序、含义相同,但是最后三个出现了数值的变化。(图片张数不变)
权重矩阵(卷积核):维度同样是四,分别为:核高度、核宽度、输入通道数、输出通道数(卷积核个数)。
相互关系:
1、卷积核的输入通道数(InDepth),由输入矩阵的通道数决定。(第一层卷积核的InDepth其实就是3)
2、输出矩阵的通道数(PutDepth),由卷积核的通道数决定。(人为定义的卷积核厚度)
3、输出矩阵的高度和宽度,由输入矩阵、卷积核、扫描方式共同决定(注:最后都要加一个floor[ ]函数。例如最后右侧算出来是512.5,要向下取整,输出高度为512)
以AlenNet模型的第一个卷积层为例:(已知stride=4,padding=0)
输入矩阵:[256,227,227,3] 一个Batch共有256张图片,每张图片的高和宽分别是277*277,每张图片的通道是3。
卷积核:[11,11,3,96] 每个卷积核的高和宽分别是11*11,通道数与输入矩阵是一样的为3,规定的卷积核数是96个。(卷积的时候有点像拿着两米长的管子去窥豹,每次窥一个斑点)
输出矩阵:[256,55,55,96] Batch是多少张,现在还是多少张。卷积核将通道3转换成为了卷积核的数量96。宽度和高度分别用公式来算:
(277-11+2*0)/4+1=55
最后列一个表,展示一下卷积的过程:
1、1*1卷积计算
一个像素大小的卷积核可以作为降低参数复杂度的手段,其作用就是将输入矩阵的通道数量进行调节,并保持它在宽度和高度上的尺寸。主要用于调节通道数,对不同的通道上的像素点进行线性组合,然后进行非线性化操作,可以完成升维和降维的功能,如下图所示,选择2个1x1大小的卷积核,那么特征图的深度将会从3变成2,如果使用4个1x1的卷积核,特征图的深度将会由3变成4。
2、全连接层
全连接层也可以被视为是一种极端情况的卷积层,其卷积核尺寸就是输入矩阵尺寸,因此输出矩阵的高度和宽度尺寸都是1。
池化计算的方法与之前有所不同,在Tensorflow中,池化有两种选择:
valid_pad = tf.nn.max_pool(x, [1, 2, 2, 1], [1, 2, 2, 1], padding='VALID')
same_pad = tf.nn.max_pool(x, [1, 2, 2, 1], [1, 2, 2, 1], padding='SAME')
在池化操作中,当池化核一步一步移动到最右侧时,会出现列数不足的问题,此时有两种处理途径:
SAME(妥协派):在右侧添加0,完成最后的池化
VALID(强硬派):不管最后一次的池化
例如,当对一个2*3的矩阵进行池化时,kernel_size=2*2,stride=2。当池化到最右侧时,出现了列数不足的问题。此时VALID强硬派会直接把第三列舍去(左图),而SAME会对第三列进行0填充进而完成池化(右图)。
故池化计算公式为: