接著上一篇線性迴歸,這篇繼續學習分類問題,資料與影片同樣是參考這個 Youtube 。
參考影片是要將2類的圖點分類, 我把它改的簡單一點,就是分成2類,正數與負數。
程式碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
import torch import torch.nn.functional as F import time device = "cuda" if torch.cuda.is_available() else "cpu" device='cpu' class Net(torch.nn.Module): def __init__(self, n_feature, n_hidden, n_output): super(Net, self).__init__() self.hidden = torch.nn.Linear(n_feature, n_hidden) self.out = torch.nn.Linear(n_hidden, n_output) def forward(self, x): x = F.relu(self.hidden(x)) x = self.out(x) return x net = Net(n_feature=1, n_hidden=100, n_output=2).to(device) x=(torch.randint(-1,1,(100,1))/10).float().to(device) y=torch.zeros(100,2).to(device) for i in range(100): if x[i][0] < 0: y[i][0], y[i][1] = 0, 1 else: y[i][0], y[i][1] = 1, 0 optimizer = torch.optim.SGD(net.parameters(), lr=0.02) loss_func = torch.nn.CrossEntropyLoss() ts = time.time() for t in range(10000): out = net(x) loss = loss_func(out, y) optimizer.zero_grad() loss.backward() optimizer.step() te = time.time() final=torch.stack((y,torch.softmax(out,1)),1 ) print(final) print("時間: " + f'{te-ts:.5f}'+"秒 by " + device) test = torch.zeros(1,1) test[0][0] = -0.3 out = net(test) print(torch.softmax(out,1)) |
注意的項目
- 輸入為1個參數,也就是一個正或負數的浮點數,中間層可以用10或100層,輸出層為2個。分類問題通常都會以 one-hot encoding 來呈現。也就是你要分類的項目有幾種,輸出就要幾個參數。這樣可以用來表式每個種類的機率
- loss function 的部份,分類問題一般用 torch.nn.CrossEntropyLoss()
- 訓練完成後,我們將正確結果與訓練結果放起來一起看。訓練結果會先用 softmax 把它轉成機率的形式,可以看到正確答案都有很高的機率。
最後,我們再自己指定一個數值-0.3來測定訓練的模型是否正確,結果也與預其的一樣。