【发布时间】:2016-01-11 10:06:11
【问题描述】:
考虑以下代码:
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'
我发现如果我将 zeros 张量的第一个维度设置为 non-None,例如 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。
【问题讨论】:
-
y=tf.zeros_like(x)会发生什么? -
@user728291 然后我得到一些形状
TensorShape([Dimension(None), Dimension(None)])的y和xy_stacked!?如果x实际上应该与y具有相同的形状,我在问题中提到的0 * xhack 似乎更有意义。在我的真实应用程序中,当然一切都更加复杂,我必须通过切片、复制和连接0 * <placeholder>的结果来构造零张量,以获得我需要的形状的张量。
标签: tensorflow