pytorchでIris
Irisをpytorchでロジスティック回帰で分類していたサイトがあった。コードが古かったのでリファクタリングを行ったのでメモ
参考URL
コードは以下
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))