機械学習第7章
多値分類
問題定義
アイリスデータセット
ポイント
N次元出力に変わる→複数の分類器ができる
→確率値の一番大きい分類器に該当するグループがモデルとしての予測値になる(グループの数だけ分類器を増やす)
ベクトル形式のパラメーターが行列形式になる
一次関数もn個必要になる→重み行列に変わる
シグモイド関数ではなくソフトマックス関数を採用する
交差エントロピー関数はソフトマックス関数の出力に対して全ての要素に対数計算をする。そのあと正解値の要素だけを抽出する。そのためには、正解値がどれか整数値で与える必要がある。
→損失関数に渡す正解値は整数値から構成される値にする
多値分類モデルにおける予測関数と損失関数の関係
元々交差エントロピー関数に該当する関数がPyTorchでは標準的に提供されていない
PyTorchの多値分類モデル用の損失関数はNLLLoss関数、CrossEntoropyLoss関数の2つ
対数関数を独立して使うと動作が不安定になるので指数関数とセットで使う設計になっている
パターン1
予測関数 線形関数のみ
損失関数 CrossEntropyLoss
パターン2
予測関数 線形関数+LogSoftmax関数
損失関数 NLLLoss関数
パターン1での実装
1 データ準備
code:python
# ライブラリのインポート
from sklearn.datasets import load_iris
# データ読み込み
iris = load_iris()
# 入力データと正解データ取得
x_org, y_org = iris.data, iris.target
# 訓練データ、検証データに分割 (シャフルも同時に実施)
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(
x_org, y_org, train_size=75, test_size=75,
random_state=123)
print(x_train.shape, x_test.shape, y_train.shape, y_test.shape)
# 入力次元数
n_input = x_train.shape1
# 出力次元数
# 分類先クラス数 今回は3になる
n_output = len(list(set(y_train)))
2 モデル定義
code:python
class Net(nn.Module):
def __init__(self, n_input, n_output):
super().__init__()
self.l1 = nn.Linear(n_input, n_output)
def forward(self, x):
x1 = self.l1(x)
return x1
net = Net(n_input, n_output)
3 データのテンソル変更
code:python
# 入力データ x_train と正解データ y_train のテンソル変数化
inputs = torch.tensor(x_train).float()
labels = torch.tensor(y_train).long()
# 検証用データのテンソル変数化
inputs_test = torch.tensor(x_test).float()
labels_test = torch.tensor(y_test).long()
損失関数の正解値は整数にする
予測値ラベルの取得方法
softmax関数は入力の段階で最大であった項目が出力後も最大になる性質を持っている
最大値取り出し方
torch.max(変数,行or列)
行ごとの集計 1
列ごとの集計 0
最大値の indexのみを取得したい場合
code:python
torch.max(outputs,1)1
nn.CrossEntropyLoss
ソフトマックス関数、対数関数、正解値要素の抽出の3つを全てまとめて実行する関数
4 繰り返し処理
code:python
# 学習率
lr = 0.01
# 初期化
net = Net(n_input, n_output)
# 損失関数: 交差エントロピー関数
criterion = nn.CrossEntropyLoss()
# 最適化アルゴリズム: 勾配降下法
optimizer = optim.SGD(net.parameters(), lr=lr)
# 繰り返し回数
num_epochs = 10000
# 評価結果記録用
history = np.zeros((0,5))
code:python
for epoch in range(num_epochs):
# 訓練フェーズ
#勾配の初期化
optimizer.zero_grad()
# 予測計算
outputs = net(inputs)
# 損失計算
loss = criterion(outputs, labels)
# 勾配計算
loss.backward()
# パラメータ修正
optimizer.step()
#予測値算出
predicted = torch.max(outputs, 1)1
# 損失と精度の計算
train_loss = loss.item()
train_acc = (predicted == labels).sum() / len(labels)
#予測フェーズ
# 予測計算
outputs_test = net(inputs_test)
# 損失計算
loss_test = criterion(outputs_test, labels_test)
# 予測ラベル算出
predicted_test = torch.max(outputs_test, 1)1
# 損失と精度の計算
val_loss = loss_test.item()
val_acc = (predicted_test == labels_test).sum() / len(labels_test)
機械学習1章・2章
機械学習3章
機械学習第6章
機械学習第8章
機械学習第9章
機械学習第10章