Tensorflow:tf.control_dependencies无法正常工作

时间:2018-12-07 11:12:35

标签: python tensorflow deep-learning

我想完成以下任务:我有一个(A,B,C,D)形张量,例如(110,14,14,32)。在计算图中,我想要获得该张量的形状作为另一个张量,并希望将第一维设置为另一个值,例如250。(250将来自tf.placeholder)。然后,我将在tf.scatter_nd调用中使用它。为了对此进行测试,我实现了以下内容:

batch_size = 250
sparse_length = 110
sparse_arr = np.random.uniform(low=-1.0, high=1.0, size=(sparse_length, 14, 14, 32))
indices = np.array(sorted(np.random.choice(a=batch_size, size=sparse_length, replace=False).tolist()))

sparse_tensor = tf.placeholder(name="sparse_arr", dtype=tf.float32)
batch_size_tensor = tf.placeholder(name="batch_size", dtype=tf.int32)
shape_tensor = tf.Variable(name="shape", trainable=False, initial_value=[0] * 4)
shape_assign_op = tf.assign(shape_tensor, tf.shape(sparse_tensor))
set_batch_size_op = tf.assign(shape_tensor[0], batch_size_tensor)

sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)

with tf.control_dependencies([shape_assign_op]):
   with tf.control_dependencies([set_batch_size_op]):
       x = tf.identity(shape_tensor)

result = sess.run([x], feed_dict={sparse_tensor: sparse_arr, batch_size_tensor: batch_size})

在上面的代码中,result返回(110,14,14,32)。就像不执行内部tf.assign块中的第二个tf.control_dependencies操作一样。我正在做的是首先使用tf.shape获取输入张量的形状并将其分配到变量shape_tensor中。然后在第二个tf.assign中,我想将shape_tensor的第一个维度设置为另一个值。 (由于Tensorflow仅支持tf.Variable的切片索引,因此我这样声明shape_tensor)。在实际程序中,卷入tf.scatter_nd的实际操作将在tf.control_dependencies块中进行,在这种情况下,我只是使用身份转换对其进行了模拟。为了正确执行以下操作,我需要将传入张量的形状转换为另一个张量,并将其第一维设置为该值的特定顺序,因此我使用tf.control_dependencies。但是它没有按预期工作。是否不支持级联tf.control_dependencies?我在这里做错了什么?还是有更简单的方法来实现此行为?

0 个答案:

没有答案