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 可能是您要查找的内容。它需要任意排列。
我看到一起转置和重塑会有帮助,但我不知道如何使用。
例如。 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 可能是您要查找的内容。它需要任意排列。