我有一个可变的批量大小,所以我的所有输入都是
形式tf.placeholder(tf.float32, shape=(None, ...)
接受变量批量大小。但是,如何使用可变批量大小创建常量值?问题在于这一行:
log_probs = tf.constant(0.0, dtype=tf.float32, shape=[None, 1])
它给了我一个错误:
TypeError: unsupported operand type(s) for *: 'NoneType' and 'int'
我确信可以用可变的批量大小初始化一个常数张量,我该怎么做?
我也尝试了以下内容:
tf.constant(0.0, dtype=tf.float32, shape=[-1, 1])
我收到此错误:
ValueError: Too many elements provided. Needed at most -1, but received 1
答案 0 :(得分:29)
tf.constant()
在图形构建时具有固定的大小和值,因此它可能不适合您的应用程序。
如果您尝试为每个元素创建具有动态大小和相同(常量)值的张量,则可以使用tf.fill()
和tf.shape()
来创建适当形状的张量。例如,要创建一个与t
具有相同形状且在任何地方都具有值input
的张量0.5
:
input = tf.placeholder(tf.float32, shape=(None, ...))
# `tf.shape(input)` takes the dynamic shape of `input`.
t = tf.fill(tf.shape(input), 0.5)
作为Yaroslav mentions in his comment,您也可以使用(NumPy-style) broadcasting来避免实现具有动态形状的张量。例如,如果input
的形状为(None, 32)
且t
的形状为(1, 32)
,则计算tf.mul(input, t)
将在第一维上广播t
以匹配形状为input
。
答案 1 :(得分:0)
假设您想使用log_probs
做某事。例如,您想对张量v
和常数log_probs
进行幂运算。并且您希望log_probs的形状随v的形状而变化。
v = tf.placeholder(tf.float32, shape=(None, 1)
log_probs = tf.constant(0.0, dtype=tf.float32, shape=[None, 1])
result = tf.pow(v, log_probs)
但是,您不能构造常量log_probs
。首先,您可以仅使用shape = [1] log_prob = tf.constant(0.0, dtype=tf.float32, shape=[None, 1])
来构造tf.constant。然后使用tf.map_fn()
对v的每个元素进行pow操作。
v = tf.placeholder(tf.float32, shape=(None, 1)
log_prob = tf.constant(0.0, dtype=tf.float32, shape=[1])
result = tf.map_fn(lambda ele : tf.pow(ele, log_prob), v)