张量恒定,大小可变

时间:2016-03-07 20:35:24

标签: tensorflow

我有一个可变的批量大小,所以我的所有输入都是

形式
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

2 个答案:

答案 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)
相关问题