fc2ブログ
pylearn2でdenoising autoencodersを使ったDeep Learning
Pylearn2をインストールして、チュートリアルを動かした後、独自のデータを使って予測モデルを作る方法です。

Pylearn2はデータの形がちょっと独特なので、CSVファイルから読み込むのが良いかと思います。こんなファイルを用意します。





クラス変数0変数1変数2
11.20.58.2
55.210.54.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


スポンサーサイト



【2014/09/11 18:46】 | 機械学習 | トラックバック(0) | コメント(0) | page top↑
MacOSXでPylearn2
Deep Learningのためのライブラリ、Pylearn2のインストールメモです。AnacondaのPython2.7とTheanoはすでにインストールされていました。このサイト参考にさせていただきました。
最初のインストールは、本家のサイトを参照。gitが必要です。環境変数は、以下の様に設定します。

export PYLEARN2_DATA_PATH="/Users/tsujishingo/pylearn2/data"
export PATH=/Users/tsuji/pylearn2/pylearn2/scripts:$PATH
export PYLEARN2_VIEWER_COMMAND="open -Wn"

openの引数がちょっと工夫ですが、その他はTheanoがちゃんと入っていればそれほど苦も無く動くと思いますが、このはじめの一歩をうごかすときのプチ嵌まりポイントが、サンプルデータ。ここから、「CIFAR-10 python version」を持ってきて、tarをDATAディレクトリで解凍しますが、

~/pylearn2/data/cifar10/cifar-10-batches-py

以下にファイルが入るようにします。まあ、make_dataset.pyのエラーが出るので、そのとき気が付きますが。
【2014/09/01 16:10】 | データ解析 | トラックバック(0) | コメント(0) | page top↑
Emacsにauto-install.elを入れて、yamlに色を付ける
Emacsでyamlファイルに色をつけたくて、よい情報を見つけたんですが、auto-installが無いことに気が付き、ここここを参考に設定したので、メモです。
.emacs.d/auto-installディレクトリを作ってそこに入れました。

wget http://www.emacswiki.org/emacs/download/auto-install.el

その後、.emacsを設定。yamlの部分は以下のコマンドをEmacsから実行してから。Emacsが無言でWebサーバの応答を待つのがちょっとだけ不安。

M-x auto-install-from-url RET https://raw.github.com/yoshiki/yaml-mode/master/yaml-mode.el

まあ、手作業でダウンロードして、/Applications/Emacs.app/Contents/Resources/site-lispに入れても良いんですけどね・・・。

;;; auto-install
(add-to-list 'load-path (expand-file-name "~/.emacs.d/auto-install/"))
(require 'auto-install)
(auto-install-update-emacswiki-package-name t)
(auto-install-compatibility-setup)

;;;; yaml-mode
(when (require 'yaml-mode nil t)
(add-to-list 'auto-mode-alist '("¥¥.yml$" . yaml-mode)))
【2014/09/01 13:40】 | Emacs | トラックバック(0) | コメント(0) | page top↑
| ホーム |