「深層学習」勉強会lt資料 "chainer使ってみた"
TRANSCRIPT
自己紹介・Twitterアカウント @kenmatsu4 ・Qiitaでブログを書いています(統計、機械学習、Python等) http://qiita.com/kenmatsu4 (2500 contributionを超えました!)
・趣味 - バンドでベースを弾いたりしています。 - 主に東南アジアへバックパック旅行に行ったりします (カンボジア、ミャンマー、バングラデシュ、新疆ウイグル自治区 etc) 旅行の写真 : http://matsu-ken.jimdo.com
Twitterアイコン
# 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関数)
# ニューラルネットの構造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�
z10�u10�
z1�u1�
z2�u1�
z9�u9�
z1000�u1000�
z999�u999�
u1##z1�
u2##z2�
z0�
z1000�u1000�
z999�u999�
u1##z1�
u2##z2�
z0�
コード:順伝播(POINT: dropout関数)
x2#
x784�
x0�
z10�u10�
z1�u1�
z2�u1�
z9�u9�z999�u999�
u1##z1�
z0�
z1000�u1000�
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)PKj exp(uj)
En = �X
k
dk log
exp(uk)PKj exp(uj)
!交差エントロピー関数
ソフトマックス関数
# Setup optimizeroptimizer = optimizers.Adam()optimizer.setup(model.collect_parameters())
コード:Optimizerの設定
Optimizerで勾配法を選択する。 今回はAdamを使用。
http://ja.scribd.com/doc/260859670/30minutes-AdamAdamの参考
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)
コード:評価
詳細はこちらをご覧ください!• 【機械学習】ディープラーニング フレームワーク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/