Theano Dimshuffle 相当于 Google 的 TensorFlow?

Theano Dimshuffle equivalent in Google's TensorFlow?

我看到一起转置和重塑会有帮助,但我不知道如何使用。

例如。 dimshuffle(0, 'x')

使用 transpose 和 reshape 相当于什么?或者,还有更好的方法? 谢谢。

在 TensorFlow 中实现 Theano 的 dimshuffle 有三个相关操作:

  • tf.transpose() 用于排列张量的维度。如果 dimshuffle 的参数中指定的模式是输入张量维度的排列(即没有 'x' 或缺少维度),您可以使用 tf.transpose() 来实现 dimshuffle() .

  • tf.expand_dims() 用于向张量添加一个或多个 size-1 维度。这处理 'x' 被指定为 dimshuffle() 模式的一部分的情况,但不会对现有维度重新排序。

  • tf.squeeze() 用于从张量中移除一个或多个 size-1 维度。这处理了 dimshuffle() 模式中省略维度的情况,但它不会对现有维度重新排序。

假设输入是一个向量,你的例子(dimshuffle(0, 'x'))只能用tf.expand_dims()表示:

input = tf.placeholder(tf.float32, [None])  # Defines an arbitrary-sized vector.
result = tf.expand_dims(input, 1)

print result.get_shape()  # ==> TensorShape([Dimension(None), Dimension(1)])

举一个更复杂的例子,应用于矩阵的 dimshuffle(1, 'x', 0) 将是:

input = tf.placeholder(tf.float32, [128, 32])  # Defines a matrix.
output = tf.expand_dims(tf.transpose(input, [1, 0]), 1)

print output.get_shape()
# ==> TensorShape([Dimension(32), Dimension(1), Dimension(128)])

我在 our framework Returnn (here 中为 TensorFlow 实现了 dimshuffle。代码是这样的:

def expand_multiple_dims(x, axes, name="expand_multiple_dims"):
  """
  :param tf.Tensor x:
  :param list[int]|tuple[int] axes: after completion, tf.shape(y)[axis] == 1 for axis in axes
  :param str name: scope name
  :return: y where we have a new broadcast axis for each axis in axes
  :rtype: tf.Tensor
  """
  with tf.name_scope(name):
    for i in sorted(axes):
      x = tf.expand_dims(x, axis=i, name="expand_axis_%i" % i)
    return x


def dimshuffle(x, axes, name="dimshuffle"):
  """
  Like Theanos dimshuffle.
  Combines tf.transpose, tf.expand_dims and tf.squeeze.

  :param tf.Tensor x:
  :param list[int|str]|tuple[int|str] axes:
  :param str name: scope name
  :rtype: tf.Tensor
  """
  with tf.name_scope(name):
    assert all([i == "x" or isinstance(i, int) for i in axes])
    real_axes = [i for i in axes if isinstance(i, int)]
    bc_axes = [i for (i, j) in enumerate(axes) if j == "x"]
    if x.get_shape().ndims is None:
      x_shape = tf.shape(x)
      x = tf.reshape(x, [x_shape[i] for i in range(max(real_axes) + 1)])  # will have static ndims
    assert x.get_shape().ndims is not None

    # First squeeze missing axes.
    i = 0
    while i < x.get_shape().ndims:
      if i not in real_axes:
        x = tf.squeeze(x, axis=i)
        real_axes = [(j if (j < i) else (j - 1)) for j in real_axes]
      else:
        i += 1

    # Now permute.
    assert list(sorted(real_axes)) == list(range(x.get_shape().ndims))
    if real_axes != list(range(x.get_shape().ndims)):
      x = tf.transpose(x, real_axes)

    # Now add broadcast dimensions.
    if bc_axes:
      x = expand_multiple_dims(x, bc_axes)
    assert len(axes) == x.get_shape().ndims
    return x

如果 tensorflow 是你的后端

from keras import baskend as K
K.permute_dimension should do

tf.transpose 可能是您要查找的内容。它需要任意排列。