一 池化函数说明
1 语法格式
tf.nn.max_pool(input,ksize,strides,padding,name=None)
tf.nn.avg
_pool(input,ksize,strides,padding,name=None)
2 参数说明
input:需要池化的输入,一般池化层接在卷积层后面,所以输入通常是feature map,依然是[batch,height,width,channels]这样的shape。
ksize:池化窗口的大小,取一个四维向量,一般是[1,height,width,1],因为我们不想在batch和channels上做池化,所以这两个维度设为1.
strides:和卷积参数含义类似,窗口在每一个维度上滑动的步长,一般也是[1,stride,stride,1
].
padding:和卷积参数含义一样,也是取VALID或者SAME,VALID是不padding操作,SAME是padding操作。
3 返回值
返回一个Tensor,类型不变,shape仍然是[batch,height,width,channels]这种形式。
二 池化函数使用
1 实例描述
通过手动生成一个4*4的矩阵来模拟图片,定义一个2*2的滤波器,通过几个在卷积神经网络中常用的池化操作来测试池化函数里的参数,并验证输出结果。
2 代码
''' 定义输入变量 定义1个输入变量用来模拟输入图片,4*4大小的2通道矩阵,并将其赋予指定的值。2个通道分别为:0 0 0 0到3 3 3 3组成的矩阵,4 4 4 4 到 7 7 7 7组成的矩阵。 ''' import tensorflow as tf img=tf.constant([ [[0.0,4.0],[0.0,4.0],[0.0,4.0],[0.0,4.0]], [[1.0,5.0],[1.0,5.0],[1.0,5.0],[1.0,5.0]], [[2.0,6.0],[2.0,6.0],[2.0,6.0],[2.0,6.0]], [[3.0,7.0],[3.0,7.0], [3.0,7.0],[3.0,7.0]] ]) img=tf.reshape(img,[1,4,4,2]) ''' 这里定义了4个池化操作和一个取均值操作。前两个操作是最大池化操作,接下来是两个均值池化操作,最后一个是取均值操作 ''' pooling=tf.nn.max_pool(img,[1,2,2,1],[1,2,2,1],padding='VALID') pooling1=tf.nn.max_pool(img,[1,2,2,1],[1,1,1,1],padding='VALID') pooling2=tf.nn.avg_pool(img,[1,4,4,1],[1,1,1,1],padding='SAME') pooling3=tf.nn.avg_pool(img,[1,4,4,1],[1,4,4,1],padding='SAME') nt_hpool2_flat = tf.reshape(tf.transpose(img), [-1, 16]) pooling4=tf.reduce_mean(nt_hpool2_flat,1) #1对行求均值(1表示轴是列) 0 对列求均值 ''' 运行池化操作 ''' with tf.Session() as sess: print("image:") image=sess.run(img) print (image) result=sess.run(pooling) print ("reslut:\n",result) result=sess.run(pooling1) print ("reslut1:\n",result) result=sess.run(pooling2) print ("reslut2:\n",result) result=sess.run(pooling3) print ("reslut3:\n",result) flat,result=sess.run([nt_hpool2_flat,pooling4]) print ("reslut4:\n",result) print("flat:\n",flat)
3 运行结果
runfile('E:/AI/TensorFlow/code/code/8-3 池化函数使用.py', wdir='E:/AI/TensorFlow/code/code')
image:
[[[[ 0. 4.]
[ 0. 4.]
[ 0. 4.]
[ 0. 4.]]
[[ 1. 5.]
[ 1. 5.]
[ 1. 5.]
[ 1. 5.]]
[[ 2. 6.]
[ 2. 6.]
[ 2. 6.]
[ 2. 6.]]
[[ 3. 7.]
[ 3. 7.]
[ 3. 7.]
[ 3. 7.]]]]
reslut:
[[[[ 1. 5.]
[ 1. 5.]]
[[ 3. 7.]
[ 3. 7.]]]]
reslut1:
[[[[ 1. 5.]
[ 1. 5.]
[ 1. 5.]]
[[ 2. 6.]
[ 2. 6.]
[ 2. 6.]]
[[ 3. 7.]
[ 3. 7.]
[ 3. 7.]]]]
reslut2:
[[[[ 1. 5. ]
[ 1. 5. ]
[ 1. 5. ]
[ 1. 5. ]]
[[ 1.5 5.5]
[ 1.5 5.5]
[ 1.5 5.5]
[ 1.5 5.5]]
[[ 2. 6. ]
[ 2. 6. ]
[ 2. 6. ]
[ 2. 6. ]]
[[ 2.5 6.5]
[ 2.5 6.5]
[ 2.5 6.5]
[ 2.5 6.5]]]]
reslut3:
[[[[ 1.5 5.5]]]]
reslut4:
[ 1.5 5.5]
flat:
[[ 0. 1. 2. 3. 0. 1. 2. 3. 0. 1. 2. 3. 0. 1. 2. 3.]
[ 4. 5. 6. 7. 4. 5. 6. 7. 4. 5. 6. 7. 4. 5. 6. 7.]]
4 结果说明
为了方便观察,调整一下格式
image结果:
[[[[ 0. 4.]
[ 0. 4.]
[ 0. 4.]
[ 0. 4.]]
[[ 1. 5.]
[ 1. 5.]
[ 1. 5.]
[ 1. 5.]]
[[ 2. 6.]
[ 2. 6.]
[ 2. 6.]
[ 2. 6.]]
[[ 3. 7.]
[ 3. 7.]
[ 3. 7.]
[ 3. 7.]]]]
和我们设置的初始值是一样的。
即第一个通道为
[[0 0 0 0],
[1 1 1 1]
[2 2 2 2]
[3 3 3 3]]
第二个通道为
[[4 4 4 4],
[5 5 5 5]
[6 6 6 6]
[7 7 7 7]]
pooling结果
[[[[ 1. 5.]
[ 1. 5.]]
[[ 3. 7.]
[ 3. 7.]]]]
这个操作在卷积神经网络中常用的,一般步长都设成与池化滤波器尺寸一致(池化的卷积尺寸为2*2,所以步长也是2),生成2个通道的2*2矩阵。矩阵的内容从原始输入中取最大值,由于池化filter中对应通道的维度为1,所以结果仍然保持源通道数。
pooling1的结果,演示的是VALID的情况
[[[[ 1. 5.]
[ 1. 5.]
[ 1. 5.]]
[[ 2. 6.]
[ 2. 6.]
[ 2. 6.]]
[[ 3. 7.]
[ 3. 7.]
[ 3. 7.]]]]
pooling2的结果,演示的是SAME的情况
[[[[ 1. 5. ]
[ 1. 5. ]
[ 1. 5. ]
[ 1. 5. ]]
[[ 1.5 5.5]
[ 1.5 5.5]
[ 1.5 5.5]
[ 1.5 5.5]]
[[ 2. 6. ]
[ 2. 6. ]
[ 2. 6. ]
[ 2. 6. ]]
[[ 2.5 6.5]
[ 2.5 6.5]
[ 2.5 6.5]
[ 2.5 6.5]]]]
pooling3的结果
[[[[ 1.5 5.5]]]]
也叫全局池化法,就是使用一个与原有输入同样尺寸的filter进行池化,一般放在最后一层,用于表达图像通过卷积网络处理后的最终特征。
pooling4是一个均值操作,可以看到将数据转置后的均值操作得到的值与全局池化平均值是一样的结果。
三 参考
https://blog.csdn.net/huahuazhu/article/details/73469491
https://blog.csdn.net/l691899397/article/details/52250190
https://blog.csdn.net/u010402786/article/details/51541465