1. 卷积层(Convolution Layer):由若干个卷积核f(filter)和偏移值b组成,(这里的卷积核相当于权值矩阵),卷积核与输入图片进行点积和累加可以得到一张feature map。

卷积层的特征:

(1)网络局部连接:卷积核每一次仅作用于图片的局部

(2)卷积核权值共享:一个卷积层可以有多个不同的卷积核,每一个filter在与输入矩阵进行点积操作的过程中,其权值是固定不变的。

Convolution Layer:卷积层

 

 

 

2. 卷积核(filter):用于提取图片的局部特征,不同的卷积核提取图片特征的效果不同。

感受野:卷积核的大小 / 范围,卷积核所能感知的区域

Convolution Layer:卷积层

  

Convolution Layer:卷积层

 

一个卷积层可以有若干个卷积核,卷积核的通道数=输入图片的通道数,每一个卷积核的通道与图片的对应通道进行点积+累加的操作,可以得到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。

Convolution Layer:卷积层

 

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:

Convolution Layer:卷积层

 

△stride:步长,进行卷积运算时,filter在输入矩阵上移动,进行点积运算,移动的步长

n=5,stride=2:

Convolution Layer:卷积层

 

输入矩阵:32*32*3;卷积核:5*5*3

Convolution Layer:卷积层

 

 

有6个卷积核,就有6个feature map

Convolution Layer:卷积层

 

 

 

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

 

Convolution Layer:卷积层

  

padding=0的情况

Convolution Layer:卷积层

 

输入:32*32*3    卷积核个数:10     卷积核:5*5*3     pading=2    stride=1 

Convolution Layer:卷积层 

 

常见的设置值:

Convolution Layer:卷积层

 

 

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