我在tensorflow中遇到问题,tf.gradients应用于池:
[编辑]:通过将等式更改为:
,我能够重现我的期望gradpooltest, = tf.gradients((pooltest * pooltest)/2 , [x1])
无论如何,我不知道为什么我必须这样做,而下面的人回答似乎并不理解我的问题。
input x1:
[[ 0. 0. 0. 0. 0. 0.]
[ 0. 2. 2. 2. 0. 0.]
[ 0. -2. 0. 0. 2. 1.]
[ 0. 1. 0. 1. 2. 2.]
[ 0. 1. 1. 2. 0. 1.]
[ 0. -2. 2. 1. -1. 1.]]
pooling test forward:
[[ 2. 2. 0.]
[ 1. 1. 2.]
[ 1. 2. 1.]]
tf.gradients pool test backward:
[[ 0. 0. 0. 0. 1. 0.]
[ 0. 1. 1. 0. 0. 0.]
[ 0. 0. 0. 0. 1. 0.]
[ 0. 1. 0. 1. 0. 0.]
[ 0. 1. 0. 1. 0. 1.]
[ 0. 0. 0. 0. 0. 0.]]
but I expect actually this result by tf.gradients pool test backward:
0 0 0 0 0 0
0 2 2 0 0 0
0 0 0 0 2 0
0 1 0 1 0 0
0 1 0 0 0 1
0 0 2 0 0 0
我不理解tf.gradients池向后测试的结果。 (看起来tensorflow只返回位置的商店矩阵??)。知道为什么tf不会返回实际的上采样结果吗?
这是我的代码:
import numpy as np
import tensorflow as tf
sess = tf.Session()
#init input-----------------------------------------------------------
init1=np.array([ [0,0,0,0,0,0],
[0,2,2,2,0,0],
[0,-2,0,0,2,1],
[0,1,0,1,2,2],
[0,1,1,2,0,1],
[0,-2,2,1,-1,1] ],dtype="float32")
init2 = init1.reshape(1,6,6,1)
x1 = tf.Variable(init2)
#init weight-----------------------------------------------------------
init3 = np.array( [[[[3, 5], [2, -1]]]], dtype="float32")
init4 = init3.reshape(2,2,1,1)
w1 = tf.Variable(init4)
#init model-----------------------------------------------------------
model = tf.initialize_all_variables()
sess.run(model)
#print values-----------------------------------------------------------
print('x1:')
#print sess.run(x6)
x1y = tf.reshape(x1, [6, 6])
print sess.run(x1y)
###################################
#ff: pooling
###################################
#needs 4D volumes as inputs:
pooltest = tf.nn.max_pool(x1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
print('pooltest:')
#print sess.run(pooltest)
pooltesty = tf.reshape(pooltest, [3, 3])
print sess.run(pooltesty)
###################################
#bw: pooling
###################################
#needs 4D volumes as inputs:
gradpooltest, = tf.gradients(pooltest , [x1])
print('gradpooltest:')
#print sess.run(gradpooltest)
gradpooltesty = tf.reshape(gradpooltest, [6, 6])
print sess.run(gradpooltesty)
sess.close()
答案 0 :(得分:0)
您正在计算maxpool操作的渐变,这是正确的 - 它们在最大值为1,在其他位置为0。
请参阅以下页面:http://cs231n.github.io/optimization-2/#patterns-in-backward-flow
答案 1 :(得分:0)
想象一下,内核大小为2x2
的最大池操作实现如下:
max(x1, x2, x3, x4)
其中x1, ..., x4
是内核下输入图像中的位置。
在正向传递中,您提取最大值,例如:
max(x1, x2, x3, x4) = x2
这意味着对于这4个变量,在正向传递中,只有x2
变量将通过网络传递。
因此,在向后传递中,您只有一个变量来计算导数,其导数为1
。
因此你得到的输出是正确的,你期望的不是。