我有三个张量, A, B and C
在tensorflow, A
和 B
都是形状 (m, n, r)
, C
是二元张量的形状 (m, n, 1)
.
我想根据 C
的值从A或B中选择元素 . 显而易见的工具是 tf.select
,但是它没有广播语义,所以我需要首先将 C
显式广播为与A和B相同的形状 .
这将是我第一次尝试如何做到这一点,但它不喜欢我将张量( tf.shape(A)[2]
)混合到形状列表中 .
import tensorflow as tf
A = tf.random_normal([20, 100, 10])
B = tf.random_normal([20, 100, 10])
C = tf.random_normal([20, 100, 1])
C = tf.greater_equal(C, tf.zeros_like(C))
C = tf.tile(C, [1,1,tf.shape(A)[2]])
D = tf.select(C, A, B)
这里的正确方法是什么?
3 回答
EDIT: 在0.12rc0之后的所有版本的TensorFlow中,问题中的代码直接起作用 . TensorFlow会自动将张量和Python数字叠加到张量参数中 . 使用
tf.pack()
的以下解决方案仅在0.12rc0之前的版本中需要 . 请注意,tf.pack()
在TensorFlow 1.0中重命名为tf.stack() .您的解决方案非常接近工作 . 您应该替换该行:
......以下内容:
(问题的原因是TensorFlow不会隐式地将张量和Python文字列表转换为张量.tf.pack()采用张量列表,因此它将转换其输入中的每个元素(
1
,1
和tf.shape(C)[2]
)由于每个元素都是一个标量,因此结果将是一个向量 . )这是一个肮脏的黑客: