見出し画像

PyTorchでDeep Learning実装。- 学習

https://note.com/dngri/n/n16991ef1f828

の続きです。まず流れですが、

クラスの実体化データを読み込み、そして訓練(tranning),テスト(test)としていきます。最後にはグラフで学習率を可視化しています。

ネットワーク、データが用意できたので学習させる実行部分です。最初に基本的なものを決めていきます。学習回数、保存用の変数、ネットワークの実体化と変数にデータを読み込んでおきます。

if __name__ == '__main__':
   # 学習回数
   epoch = 20
   # 学習結果の保存用
   history = {'train_loss': [],'test_loss': [],'test_acc': [],
   }
   # ネットワークを構築
   net: torch.nn.Module = MyNet()
   
   # MNISTのデータローダーを取得
   loaders = load_MNIST()

最適化にはAdamを使います。

optimizer = torch.optim.Adam(params=net.parameters(), lr=0.001)

最適化について詳しくは

for e in range(epoch):

です。for in ループで先に定義している回数"epoch"回繰り返し処理します。

ループの中身ですが、訓練(Trainnning)します。

     net.train(True)
       for i, (data, target) in enumerate(loaders['train']):     
           data = data.view(-1, 28*28)
           optimizer.zero_grad()
           output = net(data)
           loss = f.nll_loss(output, target)
           loss.backward()
           optimizer.step()

data.view()は1つ目の引数に-1を入れることで、2つ目の引数で指定した値にサイズ数を自動的に調整してくれます。詳細については以下参照。

optimizer.zero_grad()では保持しているデータを初期化します。詳細については、以下参照。

loss = f.nll_loss(output, target)
loss.backward()
optimizer.step()

で損失関数を使い微分、適正な勾配に更新します。

更新については以下を参考に。

次にテスト(Test)します。

      net.eval() 
       test_loss = 0
       correct = 0
       with torch.no_grad():
           for data, target in loaders['test']:
               data = data.view(-1, 28 * 28)
               output = net(data)
               test_loss += f.nll_loss(output, target, reduction='sum').item()
               pred = output.argmax(dim=1, keepdim=True)
               correct += pred.eq(target.view_as(pred)).sum().item()
       test_loss /= 10000

全体のコードでについては最初に紹介した参考サイトにあります。ログの出力部分が追加で記述してあります。

" epoch = 2"として実行したので、

画像1

ロスが大きいですが94%ぐらいにまで精度が上がっているようです。

以下にも参考サイトを貼っておきます。さらに理解が深まります。


この記事が気に入ったらサポートをしてみませんか?