入力データの構造
six パッケージ
前回、Deep Learning のフレームワーク Chainer を使った画像分類その1にてインストールしたパッケージ、sixとは何だったのか。train_mnist.py 内にてファイル mnist.pkl の読み込みに使われていたので調査。結論としては six は Python 2 と Python 3 の違いを吸収するユーティリティ。恐らく 2 と 3 を乗算して six (推測)。
データフォーマット
ファイル mnist.pkl は下記のように読み込まれている(train_mnist.py 30行目)。
mnist = six.moves.cPickle.load(mnist_pickle)
PickleはPythonオブジェクトのシリアライズを行うモジュールで、cPickleはC言語でそれが実装された高速版。
なお、MNISTとはアメリカ国立標準技術研究所が提供するデータを元に作られた手書き数字のデータベース。(→配布元)
多層パーセプトロンの作成
(train_mnist.py 43-45行目)
# Prepare multi-layer perceptron model model = chainer.FunctionSet(l1=F.Linear(784, n_units), l2=F.Linear(n_units, n_units), l3=F.Linear(n_units, 10))
Chainerが提供するLinear関数は数式
(行列Wとベクトルbはパラメータ)を示す。ニューラルネットワークのうち、「最も基本的かつ最もよく使われている」順伝播型ネットワーク(=多層パーセプトロン)において、ある層のあるユニットの入力をx1〜x4とすると、このユニットが受け取る受け取る総入力uは
u = w1x1+w2x2+w3x3+w4x4+b
と表される1。wは重み(weight)とよばれ、各入力に異なる重みづけがなされる。これにバイアスbを足したものが総入力1。第1層のユニットをi=1,...,I、第2層のユニットをj=1,...,Jで表すと、第1層のユニットの出力xと第2層のユニットの入力uは、ベクトルと行列を用いて表記すると
この時、
2。
Liner関数はデフォルトの挙動ではWはランダムに初期化されるが、bはゼロで初期化される。またLiner関数の第一引数は入力ベクトルの次元数、第二引数は出力ベクトルの次元数。
model = FunctionSet( l1 = F.Linear(4, 3), l2 = F.Linear(3, 2)) model.l1 // <chainer.functions.linear.Linear object at..>
以上より、下記の形のネットワークが形成された。
次回、Optimizerとドロップアウト、交差エントロピーをはじめとする伝搬手順の定義。→Deep Learning のフレームワーク Chainer を使った画像分類 その3
1参考: 岡谷2015 p.7-8, 2参考: 岡谷2015 p.9
参考書籍
- 岡谷貴之(2015)『深層学習 』(機械学習プロフェッショナルシリーズ)講談社