NN設計6(訓練)
いよいよ訓練を行う。基本的な構造はoptimによる関数最適化とほとんど同じである。
code:(追加)nn.py
loss_list = [] # 損失関数の履歴保持用リスト
epochs = 100 # 訓練の回数、エポック数という
model.train() # モデルを訓練モードに設定
for epoch in range(epochs):
for X, y in dataloader_train:
optimizer.zero_grad()
y_predict = model(X) # (0)
loss = loss_func(y, y_predict) # (1)
loss_list.append(loss.item())
loss.backward() # (2)
optimizer.step() # (3)
if (epoch + 1) % (epochs // 10) == 0:
print('progress =', int((epoch + 1) / epochs * 100),'%, EPOCH =', (epoch + 1), ', loss ={:.3e}'.format(loss.item()))
modelインスタンスのtrainメソッドを実行することで、自動微分などの最適化機能を有効化する。
訓練部は2重のループ構造をとる。
データローダが全てのミニバッチを出力することにより内側のループが1周する。つまり、訓練データに含まれる全てのデータがひととおり訓練に使われることを意味する。これを1エポックという。
外側のループは、訓練を何エポック分繰り返すかを指定する。
何をやっているのか?
(1)で教師データのワンホット表現yと、学習データをもとに計算した推論結果y_predictの間の誤差を求める。
(2)において、誤差に対して自動微分を適用し、計算に用いたリーフに勾配が格納される。ここでのリーフはNN設計4(最適化)でoptimizerの対象とした線形層の重みとバイアスである。
(3)により、optimizerの対象が更新される。(参考:NN設計4(最適化))
以上を十分な回数だけ繰り返すことにより、(0)において得られる推論結果y_predictがワンホット表現(正解となる教師データ)に近い値を出力するようにパラメータが調整される。
/icons/hr.icon
※ ブラウザのバックボタンで戻る