我想完成以下任务:我有一个(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
?我在这里做错了什么?还是有更简单的方法来实现此行为?