Cara menggunakan loss function Cross-entropy loss – Bisa digunakan untuk tugas klasifikasi. Loss function ini menghitung perbedaan antara dua distribusi probabilitas untuk serangkaian kejadian atau variabel acak yang disediakan.
Ini digunakan untuk menghitung skor yang merangkum perbedaan rata-rata antara nilai yang diprediksi dan nilai sebenarnya. Untuk meningkatkan akurasi model, kalian harus mencoba meminimalkan skor—skor lintas entropi antara 0 dan 1, dan nilai sempurna adalah 0.
Loss function lainnya, seperti MSE memberikan penalti prediksi yang salah. Cross-Entropy akan memberikan penalti yang banyak. Berbeda dengan Negatif Log-Likelihood Loss, yang tidak memberikan penalti berdasarkan keyakinan prediksi, Cross-Entropy menghukum prediksi yang salah tapi yakin, serta prediksi yang benar tapi kurang percaya diri.
Fungsi Cross-Entropy memiliki variasi yang luas, jenis yang paling umum adalah Binary Cross-Entropy (BCE). BCE Loss terutama digunakan untuk model klasifikasi biner; yaitu, model hanya memiliki 2 kelas. Persamaan matematika dari cross entropy yaitu
Kapan itu bisa digunakan?
- Tugas klasifikasi biner, yang merupakan fungsi kerugian default di Pytorch.
- Membuat model yang percaya diri—prediksi akan akurat dan dengan probabilitas yang lebih tinggi.
Contoh kasus
Lebih jelasnya Cara menggunakan loss function Cross-entropy loss yaitu untuk klasifikasi multiclass seperti dataset MNIST yang terdiri dari 10 kelas sehingga target isinya [0,1,2,3,4,5,6,7,8,9]. Mengingat target berupa angka tersebut maka kalian wajib menggunakan fungsi aktifasi ReLU. Langsung saja kita buat model arsitekturnya (sederhana saja hanya MLP bukan CNN sehingga tidak perlu ada Conv2D)
import os import torch from torch import nn from torchvision.datasets import MNIST from torch.utils.data import DataLoader from torchvision import transforms class MLP(nn.Module): ''' Multilayer Perceptron. ''' def __init__(self): super().__init__() self.layers = nn.Sequential( nn.Flatten(), nn.Linear(28 * 28 * 1, 64), nn.ReLU(), nn.Linear(64, 32), nn.ReLU(), nn.Linear(32, 10) ) def forward(self, x): '''Forward pass''' return self.layers(x)
Perhatikan kode nn.Linear(32, 10)
yang mengindikasikan keluaranya terdiri dari 10 kolom. Berikut kode pelatihannya
if __name__ == '__main__': # Set fixed random number seed torch.manual_seed(42) if os.path.exists('data')==False: os.mkdir('data') # Prepare MNIST dataset dataset = MNIST('data', download=True, transform=transforms.ToTensor()) trainloader = torch.utils.data.DataLoader(dataset, batch_size=10, shuffle=True, num_workers=1) # Initialize the MLP mlp = MLP() # Define the loss function and optimizer loss_function = nn.CrossEntropyLoss() optimizer = torch.optim.Adam(mlp.parameters(), lr=1e-4) # Run the training loop for epoch in range(0, 5): # 5 epochs at maximum # Print epoch print(f'Starting epoch {epoch+1}') # Set current loss value current_loss = 0.0 # Iterate over the DataLoader for training data for i, data in enumerate(trainloader, 0): # Get inputs inputs, targets = data # Zero the gradients optimizer.zero_grad() # Perform forward pass outputs = mlp(inputs) # Compute loss loss = loss_function(outputs, targets) # Perform backward pass loss.backward() # Perform optimization optimizer.step() # Print statistics current_loss += loss.item() if i % 500 == 499: print('Loss after mini-batch %5d: %.3f' % (i + 1, current_loss / 500)) current_loss = 0.0 # Process is complete. print('Training process has finished.')
Setelah selesai training sebanyak 5 epoch, kita akan uji menggunakan kode berikut, perhatikan kode prediksi = torch.argmax(prediksi,dim=1)
untuk menentukan index/lokasi value terbesar (sama seperti di Cara menggunakan loss function Negative log likelihood loss nn.NLLLoss)
a,b = next(iter(trainloader)) prediksi = mlp(a) prediksi = torch.argmax(prediksi,dim=1) print('target ',b) print('prediksi ',prediksi)
hasilnya
print('target ',b) target tensor([3, 2, 9, 7, 1, 1, 8, 4, 9, 8]) print('prediksi ',prediksi) prediksi tensor([3, 2, 9, 7, 7, 1, 8, 4, 9, 8])