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でEmacs24.3を使う(ありがとうCarbon Emacs) | ホーム | MacOSXでPylearn2>>
コメント
コメントの投稿














管理者にだけ表示を許可する

トラックバック
トラックバックURL
→http://tanopy.blog79.fc2.com/tb.php/118-f8da43c7
この記事にトラックバックする(FC2ブログユーザー)
| ホーム |