可变大小的张量流常量

tensorflow constant with variable size

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

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

A tf.constant() 在图形构造时具有固定大小和值,因此它可能不适合您的应用程序。

如果您尝试创建一个具有动态大小且每个元素都具有相同(恒定)值的张量,您可以使用 tf.fill() and 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)

As , you may also be able to use (NumPy-style) broadcasting 以避免具体化具有动态形状的张量。例如,如果 input 具有 (None, 32) 的形状并且 t 具有 (1, 32) 的形状,那么计算 tf.mul(input, t) 将在第一个维度上广播 t 以匹配input.

的形状

假设您想使用 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。首先,你可以用形状 =[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)