关键词

CNN中卷积层的计算细节

转载自:https://blog.csdn.net/dcrmg/article/details/79652487

 

前几天在看CS231n中的CNN经典模型讲解时,花了一些时间才搞清楚卷积层输入输出的尺寸关系到底是什么样的,现总结如下。(可以参照我画的题图理解卷积层的运算)

 

卷积层尺寸的计算原理

  • 输入矩阵格式:四个维度,依次为:样本数、图像高度、图像宽度、图像通道数
  • 输出矩阵格式:与输出矩阵的维度顺序和含义相同,但是后三个维度(图像高度、图像宽度、图像通道数)的尺寸发生变化。
  • 权重矩阵(卷积核)格式:同样是四个维度,但维度的含义与上面两者都不同,为:卷积核高度、卷积核宽度、输入通道数、输出通道数(卷积核个数)
  • 输入矩阵、权重矩阵、输出矩阵这三者之间的相互决定关系
    • 卷积核的输入通道数(in depth)由输入矩阵的通道数所决定。(红色标注)
    • 输出矩阵的通道数(out depth)由卷积核的输出通道数所决定。(绿色标注)
    • 输出矩阵的高度和宽度(height, width)这两个维度的尺寸由输入矩阵、卷积核、扫描方式所共同决定。计算公式如下。(蓝色标注)

 

 * 注:以下计算演示均省略掉了 Bias ,严格来说其实每个卷积核都还有一个 Bias 参数。

 

标准卷积计算举例

 

 1 x 1 卷积计算举例

 

 

全连接层计算举例

 

 

      总结下来,其实只需要认识到,虽然输入的每一张图像本身具有三个维度,但是对于卷积核来讲依然只是一个一维向量。卷积核做的,其实就是与感受野范围内的像素点进行点积(而不是矩阵乘法)。

      卷积层内卷积核的个数不是计算出来的,而是人为设计出来的。经典的网络每一个卷积层有多少个卷积核可以查看对应论文。如果是自己玩,你弄多少个都没人管你。

附:TensorFlow 中卷积层的简单实现

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

  • 输入 x:[batch, height, width, in_channel]
  • 权重 w:[height, width, in_channel, out_channel]
  • 输出 y:[batch, height, width, out_channel]

 

 

参考链接:https://zhuanlan.zhihu.com/p/29119239

本文链接:http://task.lmcjl.com/news/12518.html

展开阅读全文