ビジネスパーソン・ガジェット置場 empty lot for business

営業や仕事、それに伴う生活を便利に楽にするツール、ガジェットを作ります。既にあるツールも自分用にカスタマイズ。

python: DeZeroでのディープラーニングの学習と可視化の流れ

今回は備忘録ですが、DeZeroを利用した場合のディープラーニング学習の流れです。

DeZeroのフレームワーク

DeZeroは斎藤毅さんのゼロから作るDeepLearning③フレームワーク編で作成できるディープラーニングフレームワークです。PyPiに登録されているのでpip installでインストールして使用することができます。

 

DeZeroは自分で作ることもできるので、どうしてそう言うふうに動くのかが裏のコードを見て確認することもできます。私はまだPytorchを使用したことがないのですが、大まかなところは同じようです。今後、Pytorchなどを使用する際もわかりやすいかなと思っています。

 

大まかな流れ

今回の記事では、ディープラーニングをさせていく上での大まかな流れの確認用となります。

 

学習の大まかな流れは下記のような流れとなります。

  1. 学習用のDataLoaderから繰り返しでバッチサイズごとのデータを取り出す。(バッチサイズ分の各画像(data)をImage.open()しtransform()を適用してリストにしたものの中からxとtを取り出す)
  2. データをモデルに渡し順伝播を行ってその結果を返す
  3. 多値分類の場合は交差エントロピー誤差関数で損失を求める
  4. 勾配を一旦クリアして逆伝播を求める
  5. optimizerで重みを更新する
  6. ①〜⑤をバッチデータ分繰り返す
  7. テスト用のDataLoaderから繰り返しでバッチごとのデータを取り出す
  8. テストモード(逆伝播なし)でデータをモデルに渡し順伝播を行ってその結果を返す
  9. 損失率を求める
  10. ①〜⑩を設定したepoch数繰り返し行う
    ※途中の損失率や正確さを計測し後で可視化する場合はバッチごと、エポックごとにそれぞれデータ加算などの処理を行う。

 

コード

※ゼロから作るDeepLerningより抜粋したものを編集->カタカナ表記は学習による

※損失率の求め方については目的による(下記は多値分類でsoftmaxを使用)

import math
import numpy as np
import dezero
from dezero import optimizers
import dezero.functions as F
from dezero.models import モデル

max_epoch = 300
batch_size = 30
hidden_size = 10
lr = 1.0

train_set = データセットクラス(train=True)
test_set = データセットクラス(train=False)
train_loader = DataLoader(train_set, batch_size)
test_loader = DataLoader(test_set, batch_size, shuffle=True)

model = モデルクラス
optimizer = optimizers.オプティマイザークラス().setup(model)

10. ①〜⑩を設定したepoch数繰り返し行う
for epoch in range(max_epoch): sum_loss, sum_acc = 0, 0
1. 学習用のDataLoaderから繰り返しでバッチサイズごとのデータを取り出す。
6. ①〜⑤をバッチデータ分繰り返す
  for x, t in train_loader:
2. データをモデルに渡し順伝播を行ってその結果を返す
       y = model(x)
3. 多値分類の場合は交差エントロピー誤差関数で損失を求める
       loss = F.softmax_cross_entropy(y, t) acc = F.accuracy(y, t)
4. 勾配を一旦クリアして逆伝播を求める
       model.cleargrads() loss.backward()
5. optimizerで重みを更新する
       optimizer.update() sum_loss += float(loss.data) * len(t) sum_acc += float(acc.data) * len(t) print('epoch: {}'.format(epoch+1)) print('train loss: {:.4f}, accuracy: {:.4f}'.format(sum_loss / len(train_set), sum_acc / len(train_set))) sum_loss, sum_acc = 0, 0 with test_mode():
7. テスト用のDataLoaderから繰り返しでバッチごとのデータを取り出す
      for x, t in test_loader:
8. テストモード(逆伝播なし)でデータをモデルに渡し順伝播を行ってその結果を返す
           y = model(x)
9. 損失率を求める
           loss = F.softmax_cross_entropy(y, t) acc = F.accuracy(y, t) sum_loss += float(loss.data) * len(t) sum_acc += float(acc.data) * len(t) print('test loss: {:.4f}, accuracy: {:.4f}'.format(sum_loss / len(test_set), sum_acc / len(test_set)))

データセットクラスについては下記を参照

DeZeroのデータセットで画像データをまとめる(Dataset, DataLoader) - ビジネスパーソン・ガジェット置場 empty lot for business

 

可視化用コード

各エポックごとのデータを使用して変化を可視化する場合

訓練、テストの各損失率、正解率をリストに追加していく

 

train_losses, test_losses = [], []
train_accuracies, test_accuracies = [], []

for epoch in range(max_epoch):
       
(中略)
    sum_loss += float(loss.data) * len(t)
sum_acc += float(acc.data) * len(t)  
train_losses.append(sum_loss / (len(train_set))) train_accuracies.append(sum_acc / (len(train_set)))

(中略)  
   
    with test_mode():

(中略)

sum_loss += float(loss.data) * len(t)
sum_acc += float(acc.data) * len(t)      
test_losses.append(sum_loss / (len(train_set))) test_accuracies.append(sum_acc / (len(train_set)))


〜可視化〜
plt.plot(train_losses, label='Train')
plt.plot(test_losses, label='test')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend()


plt.plot(rain_accuracies, label='Train')
plt.plot(test_accuracies, label='test')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.legend()