异想天开

What's the true meaning of light, Could you tell me why

tensorflow如何进行卷积操作(2)

日期:2017-12-09 19:14:56
  
最后更新日期:2017-12-18 16:22:51
接着上篇tensorflow的卷积是什么(1),现在来讨论对于多个通道,多个卷积核怎么处理?
对于RGB图像处理,通道数为3,这里是容易出现概念不清晰的地方。若卷积核大小为2X2,有2个卷积核,则实际每个卷积核参数是2X2X3。
tensorflow的官方文档对tf.nn.conv2d有详细解释:
对4维input和filter计算2维卷积
input的形状为[batch, in_height, in_width, in_channels],filter的形状为[filter_height, filter_width, in_channels, out_channels].注意filter是4维的.

1.首先将filter展开成2维的矩阵.矩阵的形状为[filter_height * filter_width * in_channels, output_channels].

2.将每批次图像输入展开为一个虚拟的4维张量,张量形状为[batch, out_height, out_width, filter_height * filter_width * in_channels].

3. 步骤2得到的虚拟的3维张量,右乘filter矩阵,得到[batch, out_height, out_width, out_channels]

来看一个例子:
[code lang="cpp"]
import tensorflow as tf
import numpy

print tf.__version__

sess = tf.Session()

conv1_weights = tf.constant([ [[[ 1.0, 5.0], [ 1.0, 5.0]], [[2.0, 6.0], [2.0, 6.0]]], [[[3.0, 7.0], [3.0, 7.0]],[[4.0, 8.0], [4.0, 8.0]]] ], shape=(2,2,2,2))
init = tf.global_variables_initializer()
sess.run( init )

data = numpy.ones( shape=(1, 3, 3, 2),dtype=numpy.float32)
conv = tf.nn.conv2d(data, conv1_weights, strides=[1, 1, 1, 1], padding='SAME')

print "input:\n",data
print "\n"
print "filter:\n", sess.run( conv1_weights )

print "\n"
print "result:\n", sess.run( conv )

sess.close()
[/code]

结果如下:
input:
[[[[ 1. 1.]
[ 1. 1.]
[ 1. 1.]]

[[ 1. 1.]
[ 1. 1.]
[ 1. 1.]]

[[ 1. 1.]
[ 1. 1.]
[ 1. 1.]]]]


filter:
[[[[ 1. 5.]
[ 1. 5.]]

[[ 2. 6.]
[ 2. 6.]]]


[[[ 3. 7.]
[ 3. 7.]]

[[ 4. 8.]
[ 4. 8.]]]]


result:
[[[[ 20. 52.]
[ 20. 52.]
[ 8. 24.]]

[[ 20. 52.]
[ 20. 52.]
[ 8. 24.]]

[[ 6. 22.]
[ 6. 22.]
[ 2. 10.]]]]
result正好是tensorflow的卷积是什么(1)的两倍.这是因为输入图像的2个通道依然还是1,两个卷积核对不同的通道是一样的矩阵.2个通道就成了两倍了.
$$
输入图像通道1和输入图像通道2:
\left [ \begin{matrix} 1 & 1 & 1 & 0 \\
1 & 1 & 1 & 0\\
1 & 1 & 1 & 0 \\
0 & 0 & 0 & 0
\end{matrix} \right]


\\通道1的卷积核11和通道2的卷积核12:
\left [ \begin{matrix}1 & 2\\
3 & 4
\end{matrix} \right]

\\通道1的卷积核21和通道2的卷积核22:
\left [ \begin{matrix} 5 & 6\\
7 & 8
\end{matrix} \right]
$$
用通道1的卷积核11在通道1上做卷积操作,再通道2的卷积核12在通道2上面做卷积操作,把两者求和,就得到卷积核1在图像上面提出到的特征.
$$
\left [ \begin{matrix} 20 & 20 & 8 \\
20 & 20 & 8 \\
6 & 6 & 2
\end{matrix} \right]
$$