在 TensorFlow 中将一批张量重塑为一批向量

Reshape batch of tensors into batch of vectors in TensorFlow

在创建计算图时,我有一个张量 x 例如形状为 [-1, a, b, c],我想将其重塑为 [-1, a*b*c] 我试过这样做:

n = functools.reduce(operator.mul, x.shape[1:], 1)
tf.reshape(x, [-1, n])

但是我有一个错误:

TypeError: unsupported operand type(s) for *: 'int' and 'Dimension'

我的问题是:TensorFlow有什么东西可以做这个操作吗?

如错误消息所示,类型有问题。如果您创建一个 TensorFlow 占位符,例如与

>>> import tensorflow as tf
>>> x = tf.placeholder(tf.float16, shape=(None, 3,7,4))

并对其调用shape,则return值为

>>> x.shape
TensorShape([Dimension(None), Dimension(3), Dimension(7), Dimension(4)])

每个元素都是一个

>>> x.shape[1]
<class 'tensorflow.python.framework.tensor_shape.Dimension'>

即TensorFlow 的 Dimension class。自然地,operator.mul 函数不知道如何处理这样的类型。幸运的是,tf.TensorShape 有一个 as_list() 函数,它 return 将形状作为整数列表。

>>> x.shape.as_list()
[None, 3, 7, 4]

这样,您就可以计算出元素的数量 n,就像您习惯的那样:

>>> import functools, operator
>>> n = functools.reduce(operator.mul, x.shape.as_list()[1:], 1)
>>> n 
84
>>> y = tf.reshape(x, [-1, n])