お疲れ様です。きざきまるおです。
今回はPytorchモデルで学習を回す方法を書いていこうと思います。
それではどうぞ。
事前準備
まずは以下コードを入力しましょう。
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
import pandas as pd
from sklearn.datasets import load_wine
wine_df = load_wine()
wine_data = pd.DataFrame(wine_df.data, columns=wine_df.feature_names)
wine_target = pd.DataFrame(wine_df.target, columns=['target'])
class WineDataset(torch.utils.data.Dataset):
def __init__(self, df, transform=None):
self.features_values = df.data
self.labels = df.target
self.transform = transform
def __len__(self):
return len(self.features_values)
def __getitem__(self, idx):
features_x = torch.FloatTensor(self.features_values[idx])
labels = torch.LongTensor([self.labels[idx]])
return features_x, labels
Dataset = WineDataset(wine_df)
class NeuralModel(torch.nn.Module):
def __init__(self, features_in, features_out):
super(NeuralModel, self).__init__()
self.linear1 = nn.Linear(features_in, 128)
self.linear2 = nn.Linear(128, features_out)
self.relu = nn.ReLU()
def forward(self, x):
x = self.relu(self.linear1(x))
x = self.linear2(x)
return x
features_in = 13
features_out= 3
model = NeuralModel(features_in, features_out)
これらのコードについてはこちらの記事をご参照ください。
学習
損失関数と最適化関数
Pytorchで学習を回すためには損失関数と最適化関数を定義する必要があります。
今回は損失関数は交差エントロピー、最適化関数はAdamを使用します。
※交差エントロピー:正解の値から離れると加速度的に誤差が大きくなる損失関数
Adam:慣性に見かけの学習率と移動平均を加えた最適化手法
loss_fnc = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters())
学習ループ
誤差を格納する配列を準備して10回学習をします。
for i in range(10):
model.train()
loss_train = 0
for j ,(x, t) in enumerate(train_dataloader):
model.train()
loss_train = 0
#x, t = x.cuda(), t.cuda()
y = model(x)
loss = loss_fnc(y, t.view(-1))
loss_train += loss.item()
optimizer.zero_grad()
loss.backward()
optimizer.step()
loss_train /= j+1
record_loss_train.append(loss_train)
if i%1 == 0:
print("Epoch:", i, "Loss_Train:", loss_train)
こちらで学習が完了しました。
もし、学習後に推測値を知りたい場合は以下のように記述することで値を抽出できます。
model.eval()
model(特徴量)
以上で一通りの流れは完了です。
お試しで触るだけでもなかなか難しかったですね。
それではまた。