Softmax regresssion その1 (Pylearn2 IPython Notebook Turtorialsのチュートリアル)
はじめに
Pylearn2のサイトに“IPython Notebook Turtorialsに目を通すように"と書かれていたので読んでいたころ、 Softmax regressionのPart2:How to use pylearn2 to do softmax regressionで詰まった部分があったので書き留めておく。 (Softmax regression自体については触れていないので、他を参照してください。)
ここではIPython notebookで実行せず、静的なチュートリアルサイト[1]を参照する形で行った。
まず動かしてみる
頭から読んでいたらよくわからなくなってきたので、まずは動かしてみる。
MNISTをダウンロードしていない場合はダウンロードする
学習データがない場合、エラーが出るのでダウンロードしておく。 Pylearn2ではダウンロードするためのスクリプトが用意されている。
python ~/pylearn2/pylearn2/scripts/datasets/download_mnist.py
実行
チュートリアルでは細かく分割して書いているが、表面的には以下のようなことをしている。
1.4つのYAMLファイル(データセット、モデル、アルゴリズム、学習)を読み込む
2.パラメータを設定する
3.学習を実行する
以下に、細かく分割されていたスクリプトをまとめたものを置いた。 これを適当な名前で保存し、python xxx.pyとすれば実行できる。
import os import pylearn2 dirname = os.path.abspath(os.path.dirname('softmax_regression.ipynb')) # sr_dataset.yamlをdatasetへ読み込み、 # 文字列中の %(train_stop)i を hyper_params で置き換える。 # stop: %(train_stop)i -> stop: 50000 # % は開始、iは型指定(符号付き10進数) 参照[2] with open(os.path.join(dirname, 'sr_dataset.yaml'), 'r') as f: dataset = f.read() hyper_params = {'train_stop' : 50000} dataset = dataset % (hyper_params) with open(os.path.join(dirname, 'sr_model.yaml'), 'r') as f: model = f.read() with open(os.path.join(dirname, 'sr_algorithm.yaml'), 'r') as f: algorithm = f.read() hyper_params = {'batch_size' : 10000, 'valid_stop' : 60000} algorithm = algorithm % (hyper_params) with open(os.path.join(dirname, 'sr_train.yaml'), 'r') as f: train = f.read() save_path = '.' #ローカルスコープにある変数で置き換え train = train %locals() #実行 from pylearn2.config import yaml_parse train = yaml_parse.load(train) train.main_loop()
最終的なYAML
Train
0から50000まで学習に使う
dataset: &train !obj:pylearn2.datasets.mnist.MNIST { which_set: 'train', start: 0, stop: 50000 }
Model
n_classes: クラス分けしたい数。MNISTは0-9の数字なので10
irange: W(重さの行列)をランダムに初期化するレンジ。0から0の間で初期化
nvis: MNISTが28*28の画像なので、784個の入力層を用意する
model: !obj:pylearn2.models.softmax_regression.SoftmaxRegression { n_classes: 10, irange: 0., nvis: 784, }
Algorithm
要調査。。
BGD: batch gradient descent 共役勾配法
batch_size: 大きいほうが良いらしい
line_search_mode: 'exhaustive' : 徹底的に探索する
algorithm: !obj:pylearn2.training_algorithms.bgd.BGD { batch_size: 10000, line_search_mode: 'exhaustive', conjugate: 1, monitoring_dataset: { 'train' : *train, 'valid' : !obj:pylearn2.datasets.mnist.MNIST { which_set: 'train', start: 50000, stop: 60000 }, 'test' : !obj:pylearn2.datasets.mnist.MNIST { which_set: 'test', } }, termination_criterion: !obj:pylearn2.termination_criteria.MonitorBased { channel_name: "valid_y_misclass" } }
Extensions
extensions: [ !obj:pylearn2.train_extensions.best_params.MonitorBasedSaveBest { channel_name: 'valid_y_misclass', save_path: "./softmax_regression_best.pkl" }, ], save_path: "./softmax_regression.pkl", save_freq: 1 }
検証
Weightsを見る
Quick-start exampleと同じ要領で確認してみる。[3]
show_weights.py softmax_regression.pkl
なんとなく、左上から0,1,2...と確認できる。
学習の過程を見る
plot_monitor.py softmax_regression.pkl
b,L,Mとするとこのような感じ。