2017-02-22 23 views
3

Мне сложно понять, что и как dimshuffle() работает в 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 питона.

ответ

7

Без '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) 

Аргументы 2, 1, 0 в dimshuffle просто означает перестановку в форму кортежа.

Всякий раз, когда есть '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 (что broadcastable)

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, вы можете сохранить несколько вызовов transpose и expand_dims (обратите внимание Theano не имеет expand_dims)