Pytorch – Membuat Function Loss

By | November 27, 2022
Print Friendly, PDF & Email
287 Views

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 \sqrt{\frac{\sum(a-b)^2}{n}}. 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

See also  Pytorch Algoritma Convolutional Neural Networks - CNN

Daripada menggunakan MSE, malah lebih bagus menggunakan RMSE sesuai custom function loss yang kita buat

Leave a Reply

Your email address will not be published.




Enter Captcha Here :