NN設計(まとめ)
以上、ニューラルネットがどのような要素で構成されているのか、それらがどのように連携して動作するのかについて、Pythonのプログラムを作成する観点から解説を行った。
時間の都合上、残念ながらニューラルネットの仕組みについては解説することができなかった。興味のある方はネット上の情報や書籍を調べたり、先生に質問するなどしてより深い学びを目指してください。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
念のためにnn.pyの完成形を置いておきます。
code:nn.py
import torch as pt
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
###
### NNの設計
###
class Net(nn.Module):
def __init__(self, n_input, n_hidden, n_output):
super().__init__()
self.lin1 = nn.Linear(n_input, n_hidden)
self.lin2 = nn.Linear(n_hidden, n_output)
self.relu = nn.ReLU()
self.softmax = nn.Softmax(dim=1)
def forward(self, x):
x = self.lin1(x)
x = self.relu(x)
x = self.lin2(x)
x = self.softmax(x)
return x
###
### データの準備
###
dataset = load_iris() # (1) # データセットの取得
# 特徴量と教師データをndarray型からtensor型に変換、特徴量がtorch.float(32bit版)型にするのはお約束
X = pt.tensor(dataset'data', dtype=pt.float) y = pt.tensor(dataset'target', dtype=pt.int64) # 訓練と検証用に分割
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.25, random_state=42
)
# 教師データについて、訓練用と検証用のonehot表現を生成
y_train_onehot = F.one_hot(y_train, num_classes=3).float()
# 訓練用のデータセットを生成
dataset_train = pt.utils.data.TensorDataset(X_train, y_train_onehot)
# データローダの生成
dataloader_train = pt.utils.data.DataLoader(
dataset = dataset_train,
batch_size = 10,
shuffle = True,
num_workers = 0
)
###
### 訓練
###
n_input = 4 # アイリスデータの特徴量は4
n_hidden = 5 # 隠れ層(中間層)のノード数
n_output = 3 # アイリスデータは3種類
model = Net(n_input=n_input, n_hidden=n_hidden, n_output=n_output)
print('# model:')
print(model)
alpha = 0.01 # 学習率
optimizer = optim.SGD(model.parameters(), lr=alpha)
print('# optimizer:')
print(optimizer)
loss_func = nn.MSELoss()
print('# loss fnction:')
print(loss_func)
loss_list = [] # 損失関数の履歴保持用
epochs = 100 # 訓練の回数、エポック数という
model.train() # モデルを訓練モードに設定
for epoch in range(epochs):
for X, y in dataloader_train:
optimizer.zero_grad()
y_predict = model(X)
loss = loss_func(y, y_predict)
loss_list.append(loss.item())
loss.backward()
optimizer.step()
if (epoch + 1) % (epochs // 10) == 0:
print('progress =', int((epoch + 1) / epochs * 100),'%, EPOCH =', (epoch + 1), ', loss ={:.3e}'.format(loss.item()))
###
### 損失関数のプロット
###
plt.plot(loss_list, label='loss function')
plt.grid()
plt.legend()
plt.show()
###
### 推定精度の評価
###
model.eval() # ネットを推論モードに設定 # (8-1)
y_predict = model(X_test) # (8-2)
y_predict_max_index = y_predict.max(dim=1)1 # (8-3) y_predict_compare = (y_predict_max_index == y_test) # (8-4)
y_predict_accuracy = y_predict_compare.sum() / len(y_predict_compare) # (8-5)
print('精度: ', y_predict_accuracy.item()) # (8-6)
/icons/hr.icon
※ ブラウザのバックボタンで戻る