Pylearn2をインストールして、チュートリアルを動かした後、独自のデータを使って予測モデルを作る方法です。
Pylearn2はデータの形がちょっと独特なので、CSVファイルから読み込むのが良いかと思います。こんなファイルを用意します。
クラス 変数0 変数1 変数2 … 1 1.2 0.5 8.2 … 5 5.2 10.5 4.5 … ...
ヘッダありで、各行がサンプルを表し、最初の1列目がそのサンプルの属するクラス(0から順番に数字で識別)。このCSVを次のようなコードで読み込んで、Pylearn2のデータ形式にしてから、pklに保存します。
from pylearn2.datasets.csv_dataset import CSVDataset import pickle pyln_data = CSVDataset('file name',delimiter='\t',one_hot=True) pickle.dump(pyln_data, open('pkl file name','w'))one_hotが重要です。これで、0から10までの整数で表現されたクラスが、ニューラルネットワーク用に10個のノードで表現されます。
サンプルを参考に次のようなyamlファイルを用意します。
!obj:pylearn2.train.Train { dataset: &train !pkl: "train.pkl", model: !obj:pylearn2.models.autoencoder.DenoisingAutoencoder { nvis : 300, nhid : 150, irange : 0.05, corruptor: !obj:pylearn2.corruption.BinomialCorruptor { corruption_level: .2, }, act_enc: "tanh", act_dec: null, # Linear activation on the decoder side. }, algorithm: !obj:pylearn2.training_algorithms.sgd.SGD { learning_rate : 1e-2, batch_size : 50, monitoring_batches : 5, monitoring_dataset : *train, cost : !obj:pylearn2.costs.autoencoder.MeanSquaredReconstructionError {}, termination_criterion : !obj:pylearn2.termination_criteria.EpochCounter { max_epochs: 10 }, }, save_path: "DAE_l1.pkl", save_freq: 1 } !obj:pylearn2.train.Train { dataset: &train !obj:pylearn2.datasets.transformer_dataset.TransformerDataset { raw: !pkl: "train.pkl", transformer: !pkl: "DAE_l1.pkl" }, model: !obj:pylearn2.models.autoencoder.DenoisingAutoencoder { nvis : 150, nhid : 100, irange : 0.05, corruptor: !obj:pylearn2.corruption.BinomialCorruptor { corruption_level: .3, }, act_enc: "tanh", act_dec: null, # Linear activation on the decoder side. }, algorithm: !obj:pylearn2.training_algorithms.sgd.SGD { learning_rate : 1e-2, batch_size : 50, monitoring_batches : 5, monitoring_dataset : *train, cost : !obj:pylearn2.costs.autoencoder.MeanSquaredReconstructionError {}, termination_criterion : !obj:pylearn2.termination_criteria.EpochCounter { max_epochs: 10, }, }, save_path: "DAE_l2.pkl", save_freq: 1 } !obj:pylearn2.train.Train { dataset: &train !pkl: "train.pkl", model: !obj:pylearn2.models.mlp.MLP { batch_size: 17, layers: [ !obj:pylearn2.models.mlp.PretrainedLayer { layer_name: 'h1', layer_content: !pkl: "DAE_l1.pkl" }, !obj:pylearn2.models.mlp.PretrainedLayer { layer_name: 'h2', layer_content: !pkl: "DAE_l2.pkl" }, !obj:pylearn2.models.mlp.Softmax { max_col_norm: 1.9365, layer_name: 'y', n_classes: 12, irange: .005 } ], nvis: 300 }, algorithm: !obj:pylearn2.training_algorithms.sgd.SGD { learning_rate: .05, learning_rule: !obj:pylearn2.training_algorithms.learning_rule.Momentum { init_momentum: .5, }, monitoring_dataset: { 'valid' : *train, }, cost: !obj:pylearn2.costs.mlp.Default {}, termination_criterion: !obj:pylearn2.termination_criteria.And { criteria: [ !obj:pylearn2.termination_criteria.MonitorBased { channel_name: "valid_y_misclass", prop_decrease: 0., N: 100 }, !obj:pylearn2.termination_criteria.EpochCounter { max_epochs: 10 } ] }, update_callbacks: !obj:pylearn2.training_algorithms.sgd.ExponentialDecay { decay_factor: 1.00004, min_lr: .000001 } }, extensions: [ !obj:pylearn2.training_algorithms.learning_rule.MomentumAdjustor { start: 1, saturate: 250, final_momentum: .7 } ], save_path: "mlp.pkl", save_freq: 1 }最初の2つは、2階層分の設定ファイル。最後のは、それらを統合してfine tuningするための設定ファイルです。このファイルでは、batchサイズがサンプル数の約数になっていないと怒られるので、
Wolframに因数分解 してもらいましょう。nvis、nhidは可視層と隠れ層のノード数なので適宜調整します。
階層を増やしたいときは、レイヤーごとの設定ファイルの冒頭を次のように変更します。
dataset: &train !obj:pylearn2.datasets.transformer_dataset.TransformerDataset { raw: !pkl: "train.pkl", transformer: !obj:pylearn2.blocks.StackedBlocks { layers: [!pkl: "DAE_l1.pkl", !pkl: "DAE_l2.pkl"] } },モデルのトレーニングとテストデータの予測は、次のような関数を書くと便利かも。
from pylearn2.config import yaml_parse import os def train_step(config_file): assert(os.path.exists(config_file)) _yaml = open(config_file).read() _train = yaml_parse.load(_yaml) _train.main_loop() return _train l1_train = train_step('DAE_l1.yaml') l2_train = train_step('DAE_l2.yaml') _train = train_step('mlp.yaml') import theano # function for classifying a input vector def classify(inp,model,input_size): inp = np.asarray(inp) inp.shape = (1, input_size) return np.argmax(model.fprop(theano.shared(inp, name='inputs')).eval()) # function for calculating and printing the models accuracy on a given dataset def score(dataset,model,input_size): nr_correct = 0 for features, label in zip(dataset.X,dataset.y): if classify(features,model,input_size) == np.argmax(label): nr_correct += 1 print '{}/{} correct'.format(nr_correct, len(dataset.X)) return nr_correct, len(dataset.X) test_data = pickle.load(open('test.pkl')) score(test_data, _train.model, 300)これで、作ったモデルを使って、テストデータを予測するところまではできます。
参考にしたサイト
Pylearn2 in practice Neural Networks using Pylearn2 – termination criteria, momentum and learning rate adjustment
スポンサーサイト