构造一个TensorFlow张量,当传递给tf.concat()时其行为为空

时间:2018-08-17 05:21:24

标签: python tensorflow

我正在构建具有根据某些超参数而变化的拓扑的计算图。在某个时候,会发生串联:

c = tf.concat([a, b], axis=-1)

张量a的形状为(None, m)。 张量b的形状为(None, n),其中n取决于超参数。对于超参数的一个值,张量b在概念上应为,例如我们希望ca相同。

我可以使用以下方法成功构建图形:

b = tf.placeholder(tf.float32, (None, 0), name="Empty")

但是,如果我运行一个会话,TensorFlow会引发一个InvalidArgumentError声明:

You must feed a value for placeholder tensor 'Empty' with dtype float and shape [?,0]

是否有任何方法可以构建张量,该张量在concat操作中表现为空,但不需要馈入虚假输入呢?

很显然,我知道我可以在构造图形的代码中添加一个特殊情况,包装器等。我希望避免这种情况。

完整代码:

import tensorflow as tf
import numpy as np

a = tf.placeholder(tf.float32, (None, 10))
b = tf.placeholder(tf.float32, (None, 0), name="Empty")
c = tf.concat([a, b], axis=-1)
assert c.shape.as_list() == [None, 10]

with tf.Session() as sess:
    a_feed = np.zeros((100, 10))
    c = sess.run(c, {a : a_feed})

3 个答案:

答案 0 :(得分:0)

您可以使用tf.placeholder_with_default,它不需要使用占位符。

import tensorflow as tf
import numpy as np

# Hparams
batch_size = 100
a_dim = 10
b_dim = 0

# Placeholder for a which is required to be fed.
a = tf.placeholder(tf.float32, (None, a_dim))

# Placeholder for b, which doesn't have to be fed.
b_default = np.zeros((batch_size, b_dim), dtype=np.float32)
b = tf.placeholder_with_default(
    b_default, (None, b_dim), name="Empty"
)
c = tf.concat([a, b], axis=-1)
assert c.shape.as_list() == [None, a_dim + b_dim]

with tf.Session() as sess:
    a_feed = np.zeros((batch_size, a_dim))
    b_feed = np.ones((batch_size, b_dim))
    c_out = sess.run(c, {a : a_feed})
    # You can optionally feed in b:
    # c_out = sess.run(c, {a : a_feed, b : b_feed})
    print(c_out)

答案 1 :(得分:0)

如果您不是使用tf.placeholder()来馈送数据,而是使用tf.Estimator,那么该解决方案就很简单,因为您可以定义:

b = tf.zeros([a.shape[0].value, 0])

因此,如果已知a的形状,

c = tf.concat([a,b],axis=-1)
assert c.shape == a.shape

将始终成功。

答案 2 :(得分:0)

如消息所示,您还必须输入b

@NgModule({
  imports: [RouterModule.forRoot(routes, { useHash: true })],
  exports: [RouterModule]
})

它通过我的计算机。