考虑以下代码:
x = tf.placeholder("float", shape=[42, 4])
y = tf.zeros([42, 4], "float")
xy_stacked = tf.concat(1, [x, y])
print(x.get_shape())
print(y.get_shape())
print(xy_stacked.get_shape())
正如预期的那样,这将产生以下输出:
TensorShape([Dimension(42), Dimension(4)])
TensorShape([Dimension(42), Dimension(4)])
TensorShape([Dimension(42), Dimension(8)])
但是,如果占位符具有动态尺寸,该尺寸在运行时由传递给的值确定feed_dict=
,就像占位符经常做的那样:
x = tf.placeholder("float", shape=[None, 4])
y = tf.zeros([None, 4], "float")
xy_stacked = tf.concat(1, [x, y])
这将产生一个错误tf.zeros([None, 4], "float")
。显然Dimension(None)
不允许用于tf.zeros
:
TypeError Traceback (most recent call last)
<ipython-input-24-277eca38a392> in <module>()
2
3 x = tf.placeholder("float", shape=[None, 4])
----> 4 y = tf.zeros([None, 4], "float")
5 xy_stacked = tf.concat(1, [x, y])
6
[...]
/usr/local/lib/python3.4/dist-packages/numpy/core/_methods.py in _prod(a, axis, dtype, out, keepdims)
33
34 def _prod(a, axis=None, dtype=None, out=None, keepdims=False):
---> 35 return umr_prod(a, axis, dtype, out, keepdims)
36
37 def _any(a, axis=None, dtype=None, out=None, keepdims=False):
TypeError: unsupported operand type(s) for *: 'NoneType' and 'int'
我发现如果我将零张量的第一个维度设置为非无,例如 1,它不会产生错误:
x = tf.placeholder("float", shape=[None, 4])
y = tf.zeros([1, 4], "float")
xy_stacked = tf.concat(1, [x, y])
但随后产生的xy_stacked
张量被截断为以下大小:
TensorShape([Dimension(None), Dimension(4)])
TensorShape([Dimension(1), Dimension(4)])
TensorShape([Dimension(1), Dimension(8)])
如何用零填充占位符张量,以便获得形状张量TensorShape([Dimension(None), Dimension(8)])
在这个例子中?
到目前为止,我发现的唯一“解决方案”是如下所示:
x = tf.placeholder("float", shape=[None, 4])
y = 0 * x
xy_stacked = tf.concat(1, [x, y])
或者简单地声明y
作为占位符并始终传递正确大小的零数组。
但这看起来都不是问题的干净解决方案,并且在比这个简单示例更复杂的应用程序中,类似的黑客行为很快就会失控。
我在用着tensorflow-0.6.0-py3
.