Tensorflow–池化操作的梯度
池化操作的梯度分两部分介绍,第一部分介绍平均值池化的梯度计算,第二部分介绍最大值池化的梯度计算
一.平均值池化的梯度
利用计算梯度的函数gradients实现上述示例,具体代码如下:
import tensorflow as tfimport numpy as np# x是1个3行3列1深度的张量x=tf.placeholder(tf.float32,(1,3,3,1))# 2x2的掩码,步长是(1,1,1,1)的valid平均值池化操作sigma=tf.nn.avg_pool(x,(1,2,2,1),(1,1,1,1),'VALID')# 构造一个函数F:池化结果的和F=tf.reduce_sum(sigma)session=tf.Session()xvalue=np.random.randn(1,3,3,1)grad=tf.gradients(F,[sigma,x])results=session.run(grad,{ x:xvalue})print("---针对sigma的梯度---:")print(results[0])print("---针对x的梯度---:")print(results[1])
---针对sigma的梯度---:[[[[1.] [1.]] [[1.] [1.]]]]---针对x的梯度---:[[[[0.25] [0.5 ] [0.25]] [[0.5 ] [1. ] [0.5 ]] [[0.25] [0.5 ] [0.25]]]]
二.最大值池化的梯度
import tensorflow as tf# 初始化x的值x=tf.Variable(tf.constant([ [ [[8],[2],[9],[3]], [[4],[6],[7],[10]], [[20],[13],[1],[5]], [[12],[18],[19],[14]] ] ],tf.float32),dtype=tf.float32)# 2x2的掩码,步长为2x2的最大值池化操作x_maxPool=tf.nn.max_pool(x,(1,2,2,1),(1,2,2,1),'VALID')# 对以上最大值池化结果计算其平方和F=tf.reduce_sum(tf.square(x_maxPool))session=tf.Session()session.run(tf.global_variables_initializer())opti=tf.train.GradientDescentOptimizer(0.5).minimize(F)# 打印前2次结果for i in range(2): session.run(opti) print(session.run(x))
[[[[ 0.] [ 2.] [ 9.] [ 3.]] [[ 4.] [ 6.] [ 7.] [ 0.]] [[ 0.] [13.] [ 1.] [ 5.]] [[12.] [18.] [ 0.] [14.]]]][[[[ 0.] [ 2.] [ 0.] [ 3.]] [[ 4.] [ 0.] [ 7.] [ 0.]] [[ 0.] [13.] [ 1.] [ 5.]] [[12.] [ 0.] [ 0.] [ 0.]]]]