Numpyの基本、テンソルの形を変えるコマンド

  『行列計算(内積)の着目ポイント』 で人工知能(AI)開発で理解しておきたい線形代数の性質を説明しました。ここでは行列からテンソルに広げて、Numpyの基本コマンドを確認します。どれもAI開発で頻繁に利用されるものです。また、これらのコマンドが必要な理由についても触れています。

機械学習ライブラリ(入門編)

『機械学習ライブラリ(入門編)』に戻る>>

データの形が粘土のように変わります

内積を取る(np.dot)

 行列の内積計算です。

import numpy as np
a = np.random.randn(2,3,3)
b = np.random.randn(3,5)
c = np.dot(a, b) #内積
print('a:' + str(a.shape))
print('b:' + str(b.shape))
print('c:' + str(c.shape))
a:(2, 3, 3)
b:(3, 5)
c:(2, 3, 5)
--
3次元目が「3」→「5」に変わりました。

転置する

 転置は行と列の入れ替えです。

import numpy as np
a = np.random.randn(2,3)
b = a.T #転置
print('a:' + str(a.shape))
print('b:' + str(b.shape))
a:(2, 3)
b:(3, 2)
--
1次元目と2次元目が入れ替わります。

次元変換(reshape)

 好きな形に次元を変換できます。ただし、変換前後でデータの個数合計が一致させる必要があります(2x3x3=6×3=18)。また、4行目のように1つにまとめて記載できます。

import numpy as np
a = np.random.randn(2,3,3)
b = a.reshape(6,3)                      #次元変換
c = np.random.randn(2,3,3).reshape(6,3) #まとめて書ける
print('a:' + str(a.shape))
print('b:' + str(b.shape))
print('c:' + str(c.shape))
a:(2, 3, 3)
b:(6, 3)
c:(6, 3)
--
3次元から2次元になりました。

行列であれば、縦 x 横(=2次元)で表のようなイメージができますが、3次元以上のテンソルになると想像するのはひと苦労です。それよりも、shapeの()内の数字だけを見るぐらいがちょうどよいです。テンソルについては

の表を参照してください。

軸の入れ替え(Transpose)

 次元にも慣れたと思いますので、shapeの()内の数字の順番を入れ替えます。これもイメージで考えず、ただの数字の入れ替えぐらいに考えると楽です。

import numpy as np
a = np.random.randn(5,3,4)
b = a.transpose(2,0,1) #軸の入れ替え
print('a:' + str(a.shape))
print('b:' + str(b.shape))
a:(5, 3, 4)
b:(4, 5, 3)
--
次元の順序が入れ替わりました。

これらのコマンドが使われる場面

 MNISTデータセット(手書き数字)を0~9の数字に分類するシンプルなAIから、一部のコードを抜き出して説明します。この処理は内積計算を使って784→10にデータ変形していて、AI処理の中心になる”モデル”の部分です。最初の入力が「x_train:(60000, 784)」になっているところに注目します。

MNISTデータセットの読み込みは 『AI学習用データセットのいろいろな入手方法』 を参考にしてください。

#MNISTデータの「x_train(Numpy配列)」への読み込みは割愛
import numpy as np
w1 = np.random.randn(784, 512)
w2 = np.random.randn(512, 256)
w3 = np.random.randn(256, 10)
print('x_train:' + str(x_train.shape))
x = np.dot(x_train, w1)
print('x:' + str(x.shape))
x = np.dot(x, w2)
print('x:' + str(x.shape))
x = np.dot(x, w3)
print('x:' + str(x.shape))
x_train:(60000, 784)
x:(60000, 512)
x:(60000, 256)
x:(60000, 10)
--
2次元目が784→512→256→10と変わりました。

 728=28×28(MNISTデータは縦横28ピクセル)です。MNISTはAIが扱いやすいように前処理が済んだデータです。元の28×28ピクセルの画像をreshapeして728にしています。reshapeやtransposeはAIモデルに適した形にデータを変形する時に使われます。

AIのモデル部分とは言いましたが、画像分類ができるAIになるにはまだまだ足りない部分があります。活性化関数や誤差逆伝播、損失計算と最適化などを実装してようやく機能します。ここでは該当するシラバスを紹介します。

『機械学習ライブラリ(入門編)』に戻る>>

以上