Pytorch – Membuat Function Loss
Membuat Function Loss – Ada banyak jenis function loss yang sudah tersedia di Pytorch. Begitu banyak jenisnya mempunyai tugas khusus seperti Regression, Binary Classification dan Multi-Class Classification Loss Function. Namun terkadang kita butuh juga membuat function tersendiri sesuai keperluan.
Membuat function loss sama mudahnya seperti membuat function pada umumnya dengan membuat 2 argument input dan return 1 nilai saja. Sebagai contoh, nanti kita akan buat case seperti di Backward dan Step Optimizer pada PyTorch yaitu MLP dengan tujuan LOGIKA XOR.
Membuat Function Loss yang nanti kita buat menggunakan rumus RMSE – root mean square yaitu . Semuanya menggunakan jenis/type tensor. Yuk kita buat saja function lossnya
import torch import torch.nn as nn from matplotlib import pyplot as plt import pandas as pd def RMSE(a,b): return torch.sqrt(torch.sum((a-b)**2)/len(a))
Kita akan coba langsung terlebih dahulu, misalkan contoh berikut
a = torch.rand(1,2) b = torch.rand(1,2) c = RMSE(a,b)
Membuat Function Loss sangat mudah bukan? seperti operasi di numpy hanya saja menggunakan tensor. Sekarang kita buat arsitektur MLP yang sesuai dengan function loss RMSE yaitu logika XOR saja
class Net2(nn.Module): def __init__(self): super().__init__() self.layer1 = nn.Linear(2,10) self.layer2 = nn.Linear(10,5) self.layer3 = nn.Linear(5,1) self.sigmoid = nn.Sigmoid() self.relu = nn.ReLU() def forward(self,x): x = self.layer1(x) x = self.relu(x) x = self.layer2(x) x = self.relu(x) x = self.layer3(x) x = self.sigmoid(x) return x
Langkah selanjutnya kita buat input dan target untuk kasus XOR
x2 = torch.tensor([ [1.0,1.0], [1.0,0.0], [0.0,0.1], [0.0,0.0] ],requires_grad =True) target2 = torch.tensor([[1.0],[0.0],[0.0],[1.0]],requires_grad =True)
Yuk sekarang kita coba Membuat Function Loss yang digunakan di MLP menggunakan 100 ribu epoch untuk setiap epoch akan dicek error nya, jika kurang dari 0.001 akan break loop nya.
model2 = Net2() optimizer = torch.optim.SGD(model2.parameters(), lr = 0.01) #loss_fcn = nn.MSELoss() list_err = list() for i in range(0,100000): optimizer.zero_grad() # zero the gradient buffers prediksi = model2(x2) loss = RMSE(prediksi,target2) loss.backward() optimizer.step() list_err.append(loss.item()) if(i%100)==0: print("Epoch {: >8} Loss: {}".format(i, loss.item())) if(loss.item()<=0.001): break print(prediksi) p = pd.DataFrame(list_err) p.plot()
hasilnya yang kita dapat yaitu nilai error terus-menerus bergerak turun bahkan pada epoch ke 46ribuan sudah terhenti
Daripada menggunakan MSE, malah lebih bagus menggunakan RMSE sesuai custom function loss yang kita buat