视觉处理的就是图像,如何从数字图像中找出规律并记录下来就是当前深度学习要干的事情。
数字图像是什么?其实就是数字矩阵,具体关于数字图像的介绍,可参考这里,在TensorFlow这个深度框架中用张量来表示。
首先给出tensorflow的一段代码:
import tensorflow as tf
# 模拟数据
img = tf.Variable(tf.constant([1.0,2.0,3.0,4.,5.0],shape=[2,4,5,3]))
# 定义卷积核
filter = tf.Variable(tf.constant([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,0],shape=[2,3,3,5]))
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print("img:\n",sess.run(img))
print("filter:\n", sess.run(filter))
然后是输出结果:
img:
[[[[1. 2. 3.]
[4. 5. 5.]
[5. 5. 5.]
[5. 5. 5.]
[5. 5. 5.]]
[[5. 5. 5.]
[5. 5. 5.]
[5. 5. 5.]
[5. 5. 5.]
[5. 5. 5.]]
[[5. 5. 5.]
[5. 5. 5.]
[5. 5. 5.]
[5. 5. 5.]
[5. 5. 5.]]
[[5. 5. 5.]
[5. 5. 5.]
[5. 5. 5.]
[5. 5. 5.]
[5. 5. 5.]]]
-------------------------------------------------------
[[[5. 5. 5.]
[5. 5. 5.]
[5. 5. 5.]
[5. 5. 5.]
[5. 5. 5.]]
[[5. 5. 5.]
[5. 5. 5.]
[5. 5. 5.]
[5. 5. 5.]
[5. 5. 5.]]
[[5. 5. 5.]
[5. 5. 5.]
[5. 5. 5.]
[5. 5. 5.]
[5. 5. 5.]]
[[5. 5. 5.]
[5. 5. 5.]
[5. 5. 5.]
[5. 5. 5.]
[5. 5. 5.]]]]
filter:
[[[[ 1 2 3 4 5]
[ 6 7 8 9 10]
[11 12 13 14 15]]
[[16 17 18 19 20]
[21 22 23 24 25]
[26 27 28 29 30]]
[[31 0 0 0 0]
[ 0 0 0 0 0]
[ 0 0 0 0 0]]]
[[[ 0 0 0 0 0]
[ 0 0 0 0 0]
[ 0 0 0 0 0]]
[[ 0 0 0 0 0]
[ 0 0 0 0 0]
[ 0 0 0 0 0]]
[[ 0 0 0 0 0]
[ 0 0 0 0 0]
[ 0 0 0 0 0]]]]
Process finished with exit code 0
1 图像张量的分析
下面就来分析一下,为什么会是这样的,以及怎么理解。首先说明的是在tensorflow中数据定义格式是NHWC,即N-个数、H-高、W-宽、C-通道数。
img = tf.Variable(tf.constant([1.0,2.0,3.0,4.,5.0],shape=[2,4,5,3]))
从shape上来看,维度是[2,4,5,3],表示2个4*5的3通道图像。也就是模拟生成2张图片,每张图片大小是4行5列,通道数是3。因为常量值我提供了5个,当初始化数据不够的时候,tensorflow默认选择最后一个数据重用。
这幅图代表的是第一张图片的内容,对应的是img输出虚线上面的部分,下面具体分析。
[[1. 2. 3.]
[4. 5. 5.]
[5. 5. 5.]
[5. 5. 5.]
[5. 5. 5.]]
1.,2.,3.分别代表第一张图片的第一个像素位置三个通道上的值,在第二行代表的是第二个位置三通道的值,依次类推,这里有五行数据,那么这个图片有5列。那么上面这个矩阵就是代表了3个通道第一行的内容。因为虚线上的那个矩阵有四个部分,那么也就是这张有4行。
上面的定义了两张图片,第二张图片放置在第二个位置,三个通道的数据全部是5,这里就不画出来。其次还要关注一点,这两个图像本身是三维的张量,最后又放在一个矩阵当中并列的位置,构成了四位的张量。
2 滤波器张量的分析
首先是tensorflow中滤波器的定义格式,filter:相当于CNN中的卷积核,它要求是一个Tensor,具有[filter_height, filter_width,in_channels, out_channels]这样的shape,具体含义是[卷积核的高度,卷积核的宽度,图像通道数,卷积核个数],要求类型与参数input相同,有一个地方需要注意,第三维in_channels,就是参数input的第四维。
filter = tf.Variable(tf.constant([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,0],shape=[2,3,3,5]))
在上述代码中,我们定义了高为2 宽为3 通道数为3,卷积核个数为5的滤波器。