機械学習・自然言語処理の勉強メモ

学んだことのメモやまとめ

Theanoのdimshuffleについて

コードを読んでいると時々出てくる。
もう少し理解を深めるために色々試したのでメモ。

Documantationは下記
Basic Tensor Functionality — Theano 1.0.0 documentation



dimshuffle関数は簡単に言うと次元の置換を行う関数。

一番簡単な例は下記(行列の転置として使う例)

import theano
import theano.tensor as T
import numpy as np

row = 4
column = 2

mtx = theano.shared(np.random.uniform(-1.0, 1.0, (row, column)).astype(theano.config.floatX))

mtx.eval()
[[-0.706 -0.815]
 [-0.627 -0.309]
 [-0.206  0.078]
 [-0.162  0.37 ]]
mtx.dimshuffle(1, 0).eval()
[[-0.706 -0.627 -0.206 -0.162]
 [-0.815 -0.309  0.078  0.37 ]]

次元を変える。
次の層の入力として扱うため次元を変更する例。
(この場合、行列から3階テンソルになる。)

mtx.dimshuffle('x', 0, 1).eval()
[[[-0.706 -0.815]
  [-0.627 -0.309]
  [-0.206  0.078]
  [-0.162  0.37 ]]]

ベクトル→行列も同じ

vec = theano.shared(np.random.uniform(-1.0, 1.0, row).astype(theano.config.floatX))
vec.eval()
[-0.166  0.441 -1.    -0.395]
vec.dimshuffle(0, 'x').eval()
# vec.reshape((4, 1)).eval()
[[-0.166]
 [ 0.441]
 [-1.   ]
 [-0.395]]
vec.dimshuffle('x', 0).eval()
[[-0.166  0.441 -1.    -0.395]]
# vec.reshape((1, 4))

次元をあげたい場合、xを指定する。
(その次元数は1となる。)

※reshapeでも同じことが出来るけど、明確な使い分け方は不明
(dimshuffleの方が軸の指定だけなので使いやすいかな。。)