1. 卷积层(Convolution Layer):由若干个卷积核f(filter)和偏移值b组成,(这里的卷积核相当于权值矩阵),卷积核与输入图片进行点积和累加可以得到一张feature map。
卷积层的特征:
(1)网络局部连接:卷积核每一次仅作用于图片的局部
(2)卷积核权值共享:一个卷积层可以有多个不同的卷积核,每一个filter在与输入矩阵进行点积操作的过程中,其权值是固定不变的。
2. 卷积核(filter):用于提取图片的局部特征,不同的卷积核提取图片特征的效果不同。
感受野:卷积核的大小 / 范围,卷积核所能感知的区域
一个卷积层可以有若干个卷积核,卷积核的通道数=输入图片的通道数,每一个卷积核的通道与图片的对应通道进行点积+累加的操作,可以得到1个featrue map,假设有3个通道,那么可以得到3个featrue map,然后把这3个feature map对应的位置相加,即可得到1张featrue map,得到的这一张就是该卷积核与图片进行卷积操作的feature map。一般图片有3个通道,red、green、bule,然后卷积核的通道数为3,分别对应r、g、b,然后这对应的三个通道分别点积+累加,得到3个feature map,最后再把这3张feature ma相加,然后再加上偏移值b,就可以得到1张feature map。
3. 卷积层的运行:
①输入:输入是一张图片,图片:宽w,高h,通道数c,由c个w列h行的矩阵构成。输入矩阵的通道数=卷积核的通道数
②计算:根据padding(填充)、stride(步长),从图片的左上角开始,假设有3个通道,卷积核的对应通道与输入图片的对应通道进行点积和累加的操作,得到1张feature map,然后把3张feature map的对应位置和偏移矩阵b的对应位置相加,即可得到该卷积核对应的feature map。有多少个卷积核,就有多少个featrue map。n个卷积核经过卷积计算,得到n张featrue map。即,1张feature map中的每一个元素,是由对应的filter的不同维度的矩阵,作用于相应维度输入矩阵的不同位置,进行点积运算和累加,再加上偏移量bias的结果。
③输出:有n个卷积核,输出n张feature map,也就是n个矩阵
△padding:填充,在输入矩阵的四周补0
n=5,padding=1:
△stride:步长,进行卷积运算时,filter在输入矩阵上移动,进行点积运算,移动的步长
n=5,stride=2:
输入矩阵:32*32*3;卷积核:5*5*3
有6个卷积核,就有6个feature map
4. 卷积层输出矩阵的维度:
①通道数 = 卷积核的个数 :k个卷积核有k个feature map,输出矩阵的通道数 / 深度为k
②高度 / 宽度= (图片的高度or宽度 + 2*padding - 卷积核的高度or宽度)/ 步长 +1
一般图片的高度宽度是一样的,卷积核的高度宽度也是一样的,设图片的高度/宽度=n,卷积核的高度/宽度=f,填充padding,步长s:
h_new or w_new =(N + 2 * padding - f)/ s +1
padding=0的情况
输入:32*32*3 卷积核个数:10 卷积核:5*5*3 pading=2 stride=1
常见的设置值:
5. 代码:
- 输入 x:[batch, height, width, in_channel]
- 权重 w:[height, width, in_channel, out_channel]
- 输出 y:[batch, height, width, out_channel]
def conv_layer(x, out_channel, k_size, stride, padding): in_channel = x.shape[3].value w = tf.Variable(tf.truncated_normal([k_size, k_size, in_channel, out_channel], mean=0, stddev=stddev)) b = tf.Variable(tf.zeros(out_channel)) y = tf.nn.conv2d(x, filter=w, strides=[1, stride, stride, 1], padding=padding) y = tf.nn.bias_add(y, b) y = tf.nn.relu(y) return x
参考:
https://blog.csdn.net/dcrmg/article/details/79652487
https://blog.csdn.net/kingroc/article/details/88192878