Theano 中 dimshuffle 函数的工作原理

How the function dimshuffle works in Theano

我很难理解 dimshuffle() 在 Theano 中实现的内容和方式?我在官方文档中得到了下面的一组例子,但是没看懂它们的意思。

谁能解释一下下面每个例子的意思?

(‘x’) -> make a 0d (scalar) into a 1d vector
(0, 1) -> identity for 2d vectors
(1, 0) -> inverts the first and second dimensions
(‘x’, 0) -> make a row out of a 1d vector (N to 1xN)
(0, ‘x’) -> make a column out of a 1d vector (N to Nx1)
(2, 0, 1) -> AxBxC to CxAxB
(0, ‘x’, 1) -> AxB to Ax1xB
(1, ‘x’, 0) -> AxB to Bx1xA
(1,) -> This remove dimensions 0. It must be a broadcastable dimension (1xA to A)

请注意,我知道 broadcasting concept in numpy python。

没有'x'dimshuffle等同于transpose

为了解释的目的,让我们假装 numpy 有一个 dimshuffle 函数

x = np.arange(60).reshape((3,4,5))
x.dimshuffle(0, 1, 2).shape # gives (3, 4, 5)
x.dimshuffle(2, 1, 0).shape # gives (5, 4, 3)

因为我们有:

shp = (3,4,5)
(shp[2], shp[1], shp[0]) == (5, 4, 3)

dimshuffle 的参数 2, 1, 0 只是表示 排列 到形状元组。

只要存在 'x',它就会在数组中添加 1 个大小的维度:

x = np.arange(60).reshape((3,4,5))
x.dimshuffle(2, 1, 0, 'x').shape # (5, 4, 3, 1)
x.dimshuffle(2, 1, 'x', 0).shape # (5, 4, 1, 3)
x.dimshuffle(2, 'x', 1, 0).shape # (5, 1, 4, 3)

只要排列缺少一个(或多个)索引,这些索引就会从形状元组中删除,前提是它们为 1(可广播)

x = np.arange(1337).reshape(2,1337,1)
y = x.dimshuffle(1,0) # this works since shape[2] is 1
y.shape # (1337, 2)
z = y.dimshuffle(1) # ERROR

注意 theano 无法确定符号张量的形状,所以 dimshuffle 去除维度必须参考 broadcastable 属性。 (这与 tensorflow 不同,因为您可以在编译时指定形状)

>>> x = T.vector()
>>> x.broadcastable
(False,)
>>> y = x.dimshuffle('x', 0, 'x')
>>> y.broadcastable # the new dims are broadcastable because we added via 'x'
(True, False, True)

使用dimshuffle,你可以保存对transposeexpand_dims的多次调用(注意Theano没有expand_dims