Chainer使ってみた
@kenmatsu4
2015.8.5
機械学習プロフェッショナルシリーズ輪読会 #4
Lightning Talk  
自己紹介
・Twitterアカウント
   @kenmatsu4
・Qiitaでブログを書いています(統計、機械学習、Python等)
   http://qiita.com/kenmatsu4
   (2500 contributionを超えました!)
・趣味
   - バンドでベースを弾いたりしています。
   - 主に東南アジアへバックパック旅行に行ったりします
   (カンボジア、ミャンマー、バングラデシュ、新疆ウイグル自治区 etc)
旅行の写真 : http://matsu-ken.jimdo.com
Twitterアイコン
2015.6.9
Deep Learning Framework Chainer Release!
特徴
• All Pythonで記載ができるので、設定ファイル等
のフォーマットを覚える必要がない。
• インストールが簡単
pip install chainer
王道、MNIST手書き数字で試す。
モデルは入力784 units、出力10 units
# Prepare multi-layer perceptron model
# 多層パーセプトロンモデルの設定
# 入力 784次元、出力 10次元
model = FunctionSet(
l1=F.Linear(784, n_units),
l2=F.Linear(n_units, n_units),
l3=F.Linear(n_units, 10))
コード:モデル定義
# Prepare multi-layer perceptron model
# 多層パーセプトロンモデルの設定
# 入力 784次元、出力 10次元
model = FunctionSet(
l1=F.Linear(784, n_units),
l2=F.Linear(n_units, n_units),
l3=F.Linear(n_units, 10))
コード:モデル定義(POINT:入出力定義)
# ニューラルネットの構造
def forward(x_data, y_data, train=True):
x, t = Variable(x_data), Variable(y_data)
h1 = F.dropout(F.relu(model.l1(x)),
           train=train)
h2 = F.dropout(F.relu(model.l2(h1)),
        train=train)
y = model.l3(h2)
# 多クラス分類なので誤差関数としてソフトマックス関数の
# 交差エントロピー関数を用いて、誤差を導出
return F.softmax_cross_entropy(y, t),
F.accuracy(y, t)
コード:順伝播
# ニューラルネットの構造
def forward(x_data, y_data, train=True):
x, t = Variable(x_data), Variable(y_data)
h1 = F.dropout(F.relu(model.l1(x)),
           train=train)
h2 = F.dropout(F.relu(model.l2(h1)),
        train=train)
y = model.l3(h2)
# 多クラス分類なので誤差関数としてソフトマックス関数の
# 交差エントロピー関数を用いて、誤差を導出
return F.softmax_cross_entropy(y, t),
F.accuracy(y, t)
コード:順伝播(POINT: Variableクラス)
基本クラスの一つです
http://docs.chainer.org/en/latest/reference/core/variable.html#variable
基本クラスの一つです
http://docs.chainer.org/en/latest/reference/core/variable.html#variable
このクラスに、データ、パラメータ、
モデルの構造等を持たせて、
誤差逆伝播を行います。
# ニューラルネットの構造
def forward(x_data, y_data, train=True):
x, t = Variable(x_data), Variable(y_data)
h1 = F.dropout(F.relu(model.l1(x)),
           train=train)
h2 = F.dropout(F.relu(model.l2(h1)),
        train=train)
y = model.l3(h2)
# 多クラス分類なので誤差関数としてソフトマックス関数の
# 交差エントロピー関数を用いて、誤差を導出
return F.softmax_cross_entropy(y, t),
F.accuracy(y, t)
コード:順伝播(POINT: relu関数)
コード:順伝播(POINT: relu関数)
relu(x) = max(0, x)
# ニューラルネットの構造
def forward(x_data, y_data, train=True):
x, t = Variable(x_data), Variable(y_data)
h1 = F.dropout(F.relu(model.l1(x)),
           train=train)
h2 = F.dropout(F.relu(model.l2(h1)),
        train=train)
y = model.l3(h2)
# 多クラス分類なので誤差関数としてソフトマックス関数の
# 交差エントロピー関数を用いて、誤差を導出
return F.softmax_cross_entropy(y, t),
F.accuracy(y, t)
コード:順伝播(POINT: dropout関数)
コード:順伝播(POINT: dropout関数)
x2#
x783
x784
x1
x0
z10u10
z1u1
z2u1
z9u9
z1000u1000
z999u999
u1##z1
u2##z2
z0
z1000u1000
z999u999
u1##z1
u2##z2
z0
コード:順伝播(POINT: dropout関数)
x2#
x784
x0
z10u10
z1u1
z2u1
z9u9
z999u999
u1##z1
z0
z1000u1000
u1##z1
z0
# ニューラルネットの構造
def forward(x_data, y_data, train=True):
x, t = Variable(x_data), Variable(y_data)
h1 = F.dropout(F.relu(model.l1(x)),
           train=train)
h2 = F.dropout(F.relu(model.l2(h1)),
        train=train)
y = model.l3(h2)
# 多クラス分類なので誤差関数としてソフトマックス関数の
# 交差エントロピー関数を用いて、誤差を導出
return F.softmax_cross_entropy(y, t),
F.accuracy(y, t)
コード:順伝播(POINT: softmax関数)
コード:順伝播(POINT: softmax関数)
yk = zk = fk(u) =
exp(uk)
PK
j exp(uj)
En =
X
k
dk log
exp(uk)
PK
j exp(uj)
!
交差エントロピー関数
ソフトマックス関数
# Setup optimizer
optimizer = optimizers.Adam()
optimizer.setup(model.collect_parameters())
コード:Optimizerの設定
Optimizerで勾配法を選択する。
今回はAdamを使用。
http://ja.scribd.com/doc/260859670/30minutes-Adam
Adamの参考
for epoch in xrange(1, n_epoch+1):
perm = np.random.permutation(N)
# 0∼Nまでのデータをバッチサイズごとに使って学習
for i in xrange(0, N, batchsize):
x_batch = x_train[perm[i:i+batchsize]]
y_batch = y_train[perm[i:i+batchsize]]
# 勾配を初期化
optimizer.zero_grads()
# 順伝播させて誤差と精度を算出
loss, acc = forward(x_batch, y_batch)
# 誤差逆伝播で勾配を計算
loss.backward()
optimizer.update()
コード:学習
train_loss.append(loss.data)
train_acc.append(acc.data)
sum_loss += float(cuda.to_cpu(loss.data))
* batchsize
sum_accuracy += float(cuda.to_cpu(acc.data))
* batchsize
# 訓練データの誤差と、正解精度を表示
print 'train mean loss={}, accuracy={}'
.format(sum_loss / N,sum_accuracy / N)
コード:学習
#evaluation
#テストデータで誤差と、正解精度を算出し汎化性能を確認
sum_accuracy = 0
sum_loss = 0
for i in xrange(0, N_test, batchsize):
x_batch = x_test[i:i+batchsize]
y_batch = y_test[i:i+batchsize]
# 順伝播させて誤差と精度を算出
loss, acc = forward(x_batch,
y_batch, train=False)
test_loss.append(loss.data)
test_acc.append(acc.data)
コード:評価
sum_loss += float(cuda.to_cpu(loss.data))
* batchsize
sum_accuracy += float(cuda.to_cpu(acc.data))
* batchsize
# テストデータでの誤差と、正解精度を表示
print 'test mean loss={}, accuracy={}’
.format(sum_loss / N_test,
sum_accuracy / N_test)
コード:評価
結果
結果
間違ったのはこの1つだけ。
でも、9にも見えるので仕方ない!?
結果:パラメーター の可視化w
Autoencoder
概要
時間がないので結果だけ・・・
活性化関数 中間層数 Dropout ノイズ付加
Sigmoid 1000 あり なし
誤差の推移:20回しくらいで大体収束
活性化関数 中間層数 Dropout ノイズ付加
Sigmoid 1000 あり なし
出力結果:ほとんど復元できている
活性化関数 中間層数 Dropout ノイズ付加
Sigmoid 1000 あり なし
第一層 w
(1)
ji の可視化
活性化関数 中間層数 Dropout ノイズ付加
Sigmoid 1000 あり なし
第一層 w
(1)
ji の可視化
結構、数字のエッジ等、
特徴らしきものを捉えられている
活性化関数 中間層数 Dropout ノイズ付加
Sigmoid 1000 あり なし
第二層 の可視化w
(2)
ji
詳細はこちらをご覧ください!
• 【機械学習】ディープラーニング フレームワーク
Chainerを試しながら解説してみる。
http://qiita.com/kenmatsu4/items/7b8d24d4c5144a686412
• 【ディープラーニング】ChainerでAutoencoderを試
して結果を可視化してみる。
http://qiita.com/kenmatsu4/items/99d4a54d5a57405ecaf8
また、Chainerの仕組みについては作者の方が非常に
わかりやすくまとめられているので、ぜひご参考ください!
http://www.slideshare.net/beam2d/chainer-atfpgax7
Thanks
• Chainer Homepage
http://chainer.org
• Chainer Github page
https://github.com/pfnet/chainer
• Chainer Document
http://docs.chainer.org
• Azusa Colors (Keynote template)
http://sanographix.github.io/azusa-colors/

「深層学習」勉強会LT資料 "Chainer使ってみた"