今回は備忘録ですが、DeZeroを利用した場合のディープラーニング学習の流れです。
DeZeroは斎藤毅さんのゼロから作るDeepLearning③フレームワーク編で作成できるディープラーニングのフレームワークです。PyPiに登録されているのでpip installでインストールして使用することができます。
DeZeroは自分で作ることもできるので、どうしてそう言うふうに動くのかが裏のコードを見て確認することもできます。私はまだPytorchを使用したことがないのですが、大まかなところは同じようです。今後、Pytorchなどを使用する際もわかりやすいかなと思っています。
大まかな流れ
今回の記事では、ディープラーニングをさせていく上での大まかな流れの確認用となります。
学習の大まかな流れは下記のような流れとなります。
- 学習用のDataLoaderから繰り返しでバッチサイズごとのデータを取り出す。(バッチサイズ分の各画像(data)をImage.open()しtransform()を適用してリストにしたものの中からxとtを取り出す)
- データをモデルに渡し順伝播を行ってその結果を返す
- 多値分類の場合は交差エントロピー誤差関数で損失を求める
- 勾配を一旦クリアして逆伝播を求める
- optimizerで重みを更新する
- ①〜⑤をバッチデータ分繰り返す
- テスト用のDataLoaderから繰り返しでバッチごとのデータを取り出す
- テストモード(逆伝播なし)でデータをモデルに渡し順伝播を行ってその結果を返す
- 損失率を求める
- ①〜⑩を設定した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()