我正在尝试将张量从[A, B, C, D]
重塑为[A, B, C * D]
并将其输入到dynamic_rnn
中。假设我事先不知道B,C和D(它们是卷积网络的结果)。
我认为在Theano中,这种重塑应如下所示:
x = x.flatten(ndim=3)
似乎在TensorFlow中没有简单的方法可以做到这一点,到目前为止,这是我想到的:
x_shape = tf.shape(x)
x = tf.reshape(x, [batch_size, x_shape[1], tf.reduce_prod(x_shape[2:])]
即使在图形构建期间知道
x
的形状的情况下(即print(x.get_shape())
打印出绝对值,例如在重塑[10, 20, 30, 40]
变成get_shape()
之后的[10, None, None]
。再次,仍然假设初始形状未知,所以我不能使用绝对值进行操作。当我将
x
传递给dynamic_rnn
时,它失败了:ValueError: Input size (depth of inputs) must be accessible via shape inference, but saw value None.
为什么
reshape
无法处理这种情况?在TensorFlow中使用等级4和更高的张量复制Theano的flatten(ndim=n)
的正确方法是什么? 最佳答案
这不是reshape
的缺陷,而是tf.dynamic_rnn
的局限性。
您用来平整最后两个维度的代码是正确的。而且,reshape
的行为也正确:如果在定义展平操作时最后两个维度是未知的,那么它们的乘积也是未知的,并且None
是此时唯一可以返回的值。
罪魁祸首是tf.dynamic_rnn
,它期望在构造过程中具有完全定义的特征形状,即,必须知道除第一个(批大小)和第二个(时间步长)以外的所有尺寸。也许这有点不幸,但是当前的实现似乎不允许具有可变数量特征的RNN(如FCN)。