tf.gradients应用于汇集错误的结果?

时间:2016-10-28 11:22:56

标签: tensorflow

我在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()

2 个答案:

答案 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

因此你得到的输出是正确的,你期望的不是。