1. Ambil dataset, serta gambar pelatihan dan target, seperti yang telah kita
lakukan di bagian sebelumnya:
dari set data impor torchvision
from torch.utils.data import Dataset, DataLoader
import torch
import torch.nn as nn
device = "cuda" if torch.cuda.is_available() else "cpu"
import numpy as np
data_folder = '~/data/FMNIST' # Ini bisa berupa direktori apa
saja
# ingin mengunduh FMNIST ke
fmnist = datasets.FashionMNIST(data_folder, download = True, \
kereta = Benar)
tr_images = fmnist.data
tr_target = fmnist.targets
2. Modifikasi FMNISTDataset, yang mengambil data, sehingga gambar
input dibagi dengan 255 (intensitas/nilai maksimum piksel):
class FMNISTDataset(Dataset):
def init (self, x, y):
x = x.float()/255
x = x.view(-1,28*28)
self.x, self.y = x, y
def getitem (self, ix):
x, y = self.x[ix], self.y[ix]
return x.to(device), y.to(device)
def len (diri sendiri):
return len(self.x)
Mengambil data:
def get_data():
train = FMNISTDataset(tr_gambar, tr_target)
trn_dl = DataLoader(train, batch_size = 32, shuffle = True)
return trn_dl
Tentukan model:
dari torch.optim impor SGD
def get_model():
model = nn.Sequential(
nn.Linear(28 * 28, 1000),
nn.ReLU(),
nn.Linear(1000, 10)
).ke (perangkat)
loss_fn = nn.CrossEntropyLoss()
optimizer = SGD(model.parameters(), lr=1e-2)
model pengembalian, loss_fn, pengoptimal
Tentukan fungsi untuk melatih dan memvalidasi sekumpulan data:
def train_batch(x, y, model, opt, loss_fn):
model.train()
# panggil model Anda seperti fungsi python apa pun pada
batch Anda
# Jumlah masukan
prediksi = model(x)
# menghitung kerugian
batch_loss = loss_fn(prediksi, y)
# berdasarkan operan ke depan dalam `model(x)` menghitung
semua
# gradien dari 'model.parameters()'
batch_loss.backward()
# terapkan bobot-baru = f(bobot-lama, gradien-bobot-lama)
# di mana "f" adalah pengoptimal
pengoptimalisasi.step()
# Mengisi memori untuk perhitungan berikutnya
optimizer.zero_grad()
return batch_loss.item()
@torch.no_grad()
def akurasi(x, y, model):
model.eval()
# dapatkan matriks prediksi untuk tensor gambar `x`
prediksi = model(x)
# menghitung jika lokasi maksimum di setiap baris
# bertepatan dengan kebenaran dasar
nilai_maks, argmaks = prediksi.maks(-1)
is_correct = argmaxes == y
return is_correct.cpu().numpy().tolist()
Variasi untuk nilai training loss dan akurasi adalah sebagai berikut:
Seperti yang dapat kita lihat, kerugian pelatihan secara konsisten berkurang
dan akurasi pelatihan secara konsisten meningkat, sehingga meningkatkan
epoch ke akurasi ~85%.
Bandingkan output sebelumnya dengan skenario di mana data input tidak
diskalakan, di mana training loss tidak berkurang secara konsisten, dan akurasi
dataset pelatihan di
akhir dari lima zaman hanya 12%.
sigmoid dihitung:
Pada tabel berikut ini, kami telah menghitung kolom Sigmoid berdasarkan rumus
sebelumnya:
Pada tabel sebelah kiri, kita dapat melihat bahwa ketika nilai bobot lebih dari 0,1,
nilai Sigmoid tidak bervariasi dengan peningkatan (perubahan) nilai bobot. Selain
itu, nilai Sigmoid hanya berubah sedikit ketika bobotnya sangat kecil; satu-satunya
cara untuk memvariasikan nilai Sigmoid adalah dengan membuat bobotnya
berubah menjadi sangat, sangat kecil.
Namun, nilai Sigmoid berubah secara signifikan pada tabel sebelah kanan ketika
nilai inputnya kecil.
Alasannya adalah karena eksponensial dari nilai negatif yang besar (yang
dihasilkan dari mengalikan nilai bobot dengan angka yang besar) sangat
mendekati 0, sedangkan nilai eksponensial bervariasi ketika bobot dikalikan
dengan input berskala, seperti yang terlihat pada tabel sebelah kanan.
Sekarang kita telah memahami bahwa nilai Sigmoid tidak banyak berubah kecuali
nilai bobotnya sangat kecil, sekarang kita akan belajar tentang bagaimana nilai bobot
dapat dipengaruhi ke arah nilai yang optimal.
Penskalaan dataset input sehingga berisi rentang nilai yang jauh
lebih kecil umumnya membantu dalam mencapai akurasi model
yang lebih baik.
Selanjutnya, kita akan belajar tentang dampak dari salah satu hiperparameter
utama lainnya dari jaringan saraf: ukuran batch.
Memahami dampak dari memvariasikan
ukuran batch
Pada bagian sebelumnya, 32 titik data dipertimbangkan per batch dalam kumpulan
data pelatihan. Hal ini menghasilkan jumlah pembaruan bobot yang lebih banyak
per epoch karena ada
1.875 pembaruan bobot per epoch (60.000/32 hampir sama dengan 1.875, di mana
60.000 adalah jumlah gambar pelatihan).
Selain itu, kami tidak mempertimbangkan kinerja model pada dataset yang tidak
terlihat
(kumpulan data validasi). Kami akan membahas hal ini di bagian ini.
Sekarang setelah kita membawa data validasi ke dalam gambar, mari kita jalankan
kembali kode yang disediakan di bagian Membangun jaringan syaraf dengan kode
tambahan untuk menghasilkan data validasi, serta untuk menghitung nilai
kerugian dan akurasi dari kumpulan data validasi.
Kode untuk ukuran Batch 32 dan ukuran Batch 10.000 bagian tersedia
sebagai Varying_batch_size.ipynb di folder Chapter03 pada
repositori GitHub buku ini - https://tinyurl.com/mcvp-
packt
Ukuran batch 32
Mengingat bahwa kita telah membangun model yang menggunakan ukuran batch
32 selama pelatihan, kami akan menguraikan kode tambahan yang digunakan untuk
mengerjakan validasi
dataset. Kita akan melewatkan rincian pelatihan model karena ini sudah ada di
bagian Membangun jaringan saraf. Mari kita mulai:
1. Unduh dan impor gambar pelatihan dan target:
dari torchvision mengimpor
dataset impor obor
data_folder = '~/data/FMNIST' # Ini bisa berupa direktori apa
saja
# ingin mengunduh FMNIST ke
fmnist = datasets.FashionMNIST(data_folder, download = True, \
kereta = Benar)
tr_images = fmnist.data
tr_target = fmnist.targets
2. Dengan cara yang mirip dengan gambar pelatihan, kita harus mengunduh
dan mengimpor dataset validasi dengan menetapkan train = False
saat memanggil metode FashionMNIST di dataset kita:
val_fmnist =datasets.FashionMNIST(data_folder,download=True, \
train = False)
val_gambar = val_fmnist.data
val_target = val_fmnist.target
loss_fn = nn.CrossEntropyLoss()
optimizer = Adam(model.parameters(), lr=1e-2)
model pengembalian, loss_fn, pengoptimal
Inisialisasi daftar yang berisi akurasi pelatihan dan validasi, serta nilai
kerugian dari epoch yang meningkat:
Ulangi lima zaman dan inisialisasi daftar yang berisi akurasi dan kerugian
di seluruh kumpulan data pelatihan dalam zaman tertentu:
untuk epoch dalam range(5):
cetak (zaman)
train_epoch_losses, train_epoch_accuracies = [], []
Ulangi melalui kumpulan data pelatihan dan hitung akurasi
(train_epoch_accuracy) dan nilai kerugian (train_epoch_loss)
dalam satu epoch:
Hitung nilai kerugian dan akurasi dalam satu batch data validasi (karena
ukuran batch data validasi sama dengan panjang data validasi):
Seperti yang Anda lihat, akurasi pelatihan dan validasi mencapai ~85% pada
akhir lima epoch ketika ukuran batch 32. Selanjutnya, kita akan memvariasikan
parameter batch_size
ketika melatih DataLoader dalam fungsi get_data untuk melihat dampaknya
terhadap akurasi pada akhir lima epoch.
Dengan hanya membuat perubahan yang diperlukan pada langkah 5 dan setelah menjalankan
semua langkah hingga langkah 9, variasi dalam akurasi pelatihan dan validasi dan kehilangan
selama peningkatan epoch ketika ukuran batch 10.000 adalah sebagai berikut:
Di sini, kita dapat melihat bahwa nilai akurasi dan loss tidak mencapai tingkat yang sama
dengan skenario sebelumnya, di mana ukuran batch adalah 32, karena bobot waktu
diperbarui lebih sedikit ketika ukuran batch 32 (1875). Pada skenario dengan ukuran batch
10.000, terdapat enam kali pembaruan bobot per epoch karena terdapat 10.000 titik data per
batch, yang berarti total ukuran data pelatihan adalah 60.000.
Sejauh ini, kita telah mempelajari cara menskalakan dataset, serta dampak dari
memvariasikan ukuran batch pada waktu pelatihan model untuk mencapai akurasi
tertentu. Pada bagian selanjutnya, kita akan mempelajari dampak dari memvariasikan
pengoptimal kerugian pada dataset yang sama