pytorchでIris

Irisをpytorchでロジスティック回帰で分類していたサイトがあった。コードが古かったのでリファクタリングを行ったのでメモ

参考URL

https://kyoro1.github.io/2020/04/04/Pytorch%E3%81%A7logistic%E5%9B%9E%E5%B8%B0%E3%82%92%E3%82%84%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B/

コードは以下

from sklearn.datasets import load_iris
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim

# irisデータセット
iris = load_iris()

# from_numpyだけだと、double型に変換されてしまうため、float, longを強制する。
train_X = torch.from_numpy(iris.data).float()
train_y = torch.from_numpy(iris.target).long()

model = nn.Sequential(
   nn.Linear(4, 100),
   nn.ReLU(),
   nn.Linear(100, 50),
   nn.ReLU(),
   nn.Linear(50, 3),
   nn.LogSoftmax(dim=1)
)

optimizer = optim.SGD(model.parameters(), lr=0.02)

for epoch in range(1000):
   ## pytorchでは勾配を蓄積する仕組みなので更新前に初期化しておきます
   optimizer.zero_grad()
   ## feed forward(つまり予測させます)
   output = model(train_X)
   ## 予実差からの誤差を決めます。nll_lossは、Negative Log Likelihood(負の対数尤度)ですね。
   loss = F.nll_loss(output, train_y)

   ## 微分を行う
   loss.backward()
   ## 各層内のパラメータの更新
   optimizer.step()


   ## 正解率の計算
   prediction = output.data.max(1)[1]
   accuracy = prediction.eq(train_y.data).sum().numpy() / len(iris.data)

   if epoch % 100 == 0:
       print('Train Step: {}\tLoss: {:.3f}\tAccuracy: {:.3f}'.format(epoch, loss.data.item(), accuracy))


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