Linear分類の実装


Logistic Classification



仮定設定とアクティブ化関数を上記の設定に設定すると、Gradient Descentを取得できます.
機械学習、人工知能、深さ学習のすべての過程.
データ・ロード->モデル学習->データ評価または結果予測.学習プロセスを順番に行います.

データのロード

# pytorch
import torch
# 최적화 알고리즘 : SGD 
import torch.optim as optim


# For reproducibility
torch.manual_seed(1)

# 임의 데이터 생성
x_data = [[1, 2], [2, 3], [3, 1], [4, 3], [5, 3], [6, 2]]
y_data = [[0], [0], [0], [1], [1], [1]]


x_train = torch.FloatTensor(x_data)
y_train = torch.FloatTensor(y_data)

print(x_data)
print(x_train)

print(x_train.shape)
print(y_train.shape)

最適化アルゴリズムSGDを使用するために,optimというモジュールを導入し,この値をランダム呼び出しのある部分で固定するためにtorch.manual_seed(1)に固定した.
その後、私は任意の数のデータをロードしました.これらのデータは1時間の学習で、2回参加した学生は不合格です(0)、
6時間に2回勉強した学生は合格した(1).
これらのデータをモデル学習に用いるためにTensor化を行った.

学習モデル

# 모델 초기화
# 입력데이터 (x) ==> 2
# 출력 (Y) ==> 0 / 1
W = torch.zeros((2, 1), requires_grad=True)
b = torch.zeros(1, requires_grad=True)

# optimizer 설정
optimizer = optim.SGD([W, b], lr=1)

nb_epochs = 1000
for epoch in range(nb_epochs + 1):

    # Cost 계산
    hypothesis = torch.sigmoid(x_train.matmul(W) + b) # or .mm or @
    cost = -(y_train * torch.log(hypothesis) + 
             (1 - y_train) * torch.log(1 - hypothesis)).mean()

    # cost로 H(x) 개선
    optimizer.zero_grad()
    cost.backward()
    optimizer.step()

    # 100번마다 로그 출력
    if epoch % 100 == 0:
        print('Epoch {:4d}/{} Cost: {:.6f}'.format(
            epoch, nb_epochs, cost.item()
        ))

以前Linear Regressionで学習したモデルとは異なり,HypothesisとCostのみを変えた.Wは、入力データが2次元、出力が0または1の1次元データである.
従って、Wは2行1列のゼロ行列に初期化され、学習の変数としてrequire gradがTrueに設定される.
同様に,SGDをWとBの最適値を探すアルゴリズムとして用い,1の学習率を用いた.
バイナリ分類のためにsigmoid仮定を用い,上記のLogisticを用いて変更した.
その後、後方に実行するという意味は、計算完了本で、オプティマイザのアルゴリズム、オプティマイザを実行します.Step()を使用してWを更新します.

データ評価

hypothesis = torch.sigmoid(x_train.matmul(W) + b)
print(hypothesis[:5])

これは、予測に使用したx trainデータをモデルに戻して、よく勉強したWとBをモデルに戻したことを確認するコードです.
予測を行った後、5行だけチェックすると、0と1ではなく奇妙な値が表示されます.
いわゆるLogistic Regressionは分類データであるため、予測した仮説値を即座に出力するのではなく、その仮説値の中で0.5より大きいと合格(1またはTrue)が表示され、それより小さいと不合格(0またはFlash)が表示される.
prediction = hypothesis >= torch.FloatTensor([0.5])

correct_prediction = prediction.float() == y_train
print(correct_prediction[:5])

accuracy = correct_prediction.sum().item() / len(correct_prediction)
print('The model has an accuracy of {:2.2f}% for the training set.'.format(accuracy * 100))

このように0と1に再表記した後、元の正解y trainと比較し、正しい予測があるかどうかを確認します.
最初の5行のラベル予測はすべて真で、精度は100%です.
次に、学習したデータではなく、予測したい任意の値を超える値を予測する方法を見てみましょう.
XX = [[100, 5]]
xx = torch.FloatTensor(XX);
hypothesis = torch.sigmoid(xx.matmul(W) + b)
prediction = hypothesis >= torch.FloatTensor([0.5])
print(prediction)

100時間勉強して5時間参加したら合格か不合格か?このような予測
結果は合格であることを証明した.
このようにして,ごみ情報か猫情報かの2つの場合にのみ予測を行うモデルを構築した.次に、予測する結果値(ラベル値)をいくつか予測します.

multi-classification


データローダ

import torch
import torch.optim as optim
# For reproducibility
torch.manual_seed(1)

x_train = [[1, 2, 1, 1],
           [2, 1, 3, 2],
           [3, 1, 3, 4],
           [4, 1, 5, 5],
           [1, 7, 5, 5],
           [1, 2, 5, 6],
           [1, 6, 6, 6],
           [1, 7, 7, 7]]
y_train = [2, 2, 2, 1, 1, 1, 0, 0]

x_train = torch.FloatTensor(x_train)
y_train = torch.LongTensor(y_train)

print(x_train[:5])   # 첫 다섯 개
print(y_train[:5])
y trainのラベル値から見ると,0と1だけでなく,3つ以上のラベル値を予測する分類モデルである2というラベル値も存在する.
データレコーダ部は、Binary Classification部と同様に伸張されている.

学習モデル

import torch.nn.functional as F  # for softmax


# 모델 초기화
# feature 4개, 3개의 클래스
nb_class = 3
nb_data = len(y_train)

W = torch.zeros((4, nb_class), requires_grad=True)
b = torch.zeros(1, requires_grad=True)
# optimizer 설정
optimizer = optim.SGD([W, b], lr=0.01)
nb_epochs = 1000
for epoch in range(nb_epochs + 1):

    # Cost 계산 (1)
    hypothesis = F.softmax(x_train.matmul(W) + b, dim=1) # or .mm or @
    
    # cost 표현번 1번 예시
    y_one_hot = torch.zeros(nb_data, nb_class)
    y_one_hot.scatter_(1, y_train.unsqueeze(1), 1)
    cost = (y_one_hot * -torch.log(F.softmax(hypothesis, dim=1))).sum(dim=1).mean()
    
    # cost 표현법 2번 예시
    # cross_entropy를 사용하면 scatter 함수를 이용한 one_hot_encoding을 안해도 됨
    # cost = F.cross_entropy((x_train.matmul(W) + b), y_train)

    # cost로 H(x) 개선
    optimizer.zero_grad()
    cost.backward()
    optimizer.step()

    # 100번마다 로그 출력
    if epoch % 100 == 0:
        print('Epoch {:4d}/{} Cost: {:.6f}'.format(
            epoch, nb_epochs, cost.item()
        ))

Feature(データ列の個数)が4,class(ラベルの個数)が3であるため,Wが4行3列のゼロ行列を作成した.
オプティマイザは仮定設定でSoftmaxアクティブ化関数を使用した点で同じSGDを使用する.(ここではCrossEntropyを使用するか、Softmaxを直接呼び出すことができます.)
その後、y trainを憎しみ符号化で一列に並べ、次いで(y_train.unsqueeze(1))上記のようにコストを計算する.

データ評価


再度,我々が作成したモデルがどれだけ良い予測性を持っているかを用い,以前学習に用いたデータx trainを用いて検証した.
# 학습된 W,b를 통한 클래스 예측
hypothesis = F.softmax(x_train.matmul(W) + b, dim=1) # or .mm or @
predict = torch.argmax(hypothesis, dim=1)

torch.argmax()
print(hypothesis)
print(predict)
print(y_train)


# 정확도 계산 
correct_prediction = predict.float() == y_train
print(correct_prediction)
accuracy = correct_prediction.sum().item() / len(correct_prediction)
print('The model has an accuracy of {:2.2f}% for the training set.'.format(accuracy * 100))

このようにして得られた値は、第1行の0.3633,0.1321である.0.5046でargmax関数は、最大数値インデックスの値を取得します.
その後,予測値が実際のy train値と比較して86.5%の精度であることを検証した.
これまで,Softmaxを用いて分類を完了する方法を学習してきた.
現在は任意のデータを使用していますが、次回は複数の共通データを使用して予測を試みます.