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...と確認できる。

f:id:w_endo:20151106125710p:plain

学習の過程を見る

plot_monitor.py softmax_regression.pkl

b,L,Mとするとこのような感じ。

f:id:w_endo:20151106131438p:plain

参考

  1. pylearn2 tutorial: Softmax regression
  2. Pythonライブラリリファレンス 3.6.2 文字列フォーマット操作
  3. Quick-start example