如上图所示,该结构为卷积神经网络结构中最重要的部分,被称为过滤器(filter)或者内核(kernel),其作用是将当前层神经网络上的一个子节点矩阵转化为下一层神经网络上的一个单位节点矩阵。单位节点矩阵指长和宽都为1,但深度不限的节点矩阵。
在一个卷积层中,过滤器所处理的节点矩阵的长和宽都是人工指定的,这个节点矩阵的尺寸也被称之为过滤器的尺寸。通常用的尺寸为3x3或5x5.因为过滤器处理的矩阵深度和当前层神经网络节点矩阵的深度一致,所以只需要指定两个维度。
在上图中,过滤器的前向传播就是通过左侧小矩阵中的节点计算出右侧单位矩阵中节点的过程。
以下代码通过Tensorflow实现了卷积层,代码如下:
#通过tf.get_variable的方式创建过滤器的权重变量和偏置项变量,上面介绍了
#卷积层参数个数之和过滤器的尺寸、深度以及当前层节点矩阵的深度有关,所以这里
#声明的参数变量是一个四维矩阵,前面两个维度代表了过滤器的尺寸,第三个维度表示当前
#层的深度,第四个参数表示过滤器的深度
filter_weight=tf.get_variable(
'weights',[5,5,3,16],
initializer=tf.truncated_normal_initializer(stddev=0.1)
)
#和卷积层的权重类似,当前层矩阵上不同位置的偏置项也是共享的,所以总共下一层深度个不同的
#偏置项。本样例为16也就是下一层神经网络中节点矩阵的深度。
biases=tf.get_variable(
'baises',[16],initializer=tf.constant_initializer(0.1)
)
conv=tf.n.conv.2d(
input,filter_weight,strides=[1,1,1,1],padding='SAME'
)
bias=tf.nn.bias_add(conv,biases)
actived_conv=tf.nn.relu(bias)