Download as pdf or txt
Download as pdf or txt
You are on page 1of 3

o root='.

/data': Đường dẫn đến thư mục nơi dữ liệu CIFAR-10 được tải xuống
và lưu trữ. Thư mục "./data" chỉ định rằng thư mục "data" nằm trong thư
Xử lý dữ liệu: mục hiện tại.
- transform = transforms.Compose([transforms.ToTensor(), o train=False: Đặt giá trị False để tải xuống tập dữ liệu kiểm tra CIFAR-10.
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) o download=True: Đặt giá trị True để tải xuống tập dữ liệu CIFAR-10 nếu
o transforms.ToTensor(): Chuyển đổi hình ảnh thành đối tượng tensor. Điều chưa tồn tại trong thư mục root.
này chuyển đổi hình ảnh từ định dạng PIL hoặc NumPy array sang tensor. o transform=transform: Sử dụng biến transform đã được xây dựng trước đó
o transforms.Normalize(): Chuẩn hóa hình ảnh theo giá trị trung bình và độ để chuyển đổi dữ liệu hình ảnh thành tensor và chuẩn hóa
lệch chuẩn đã cho. Trong trường hợp này, giá trị trung bình của các kênh o Sử dụng nó để đánh giá mô hình của mình
màu là (0.5, 0.5, 0.5) và độ lệch chuẩn là (0.5, 0.5, 0.5) - testloader = DataLoader(testset, batch_size=10, shuffle=False,
- trainset = datasets.CIFAR10(root='./data', train=True, download=True, num_workers=2)
transform=transform) o testset: Đối tượng testset đã được tạo từ CIFAR-10 dataset.
o Tạo một đối tượng trainset từ CIFAR-10 dataset với các tham số như sau: o batch_size=10: Kích thước của từng batch dữ liệu. Trong trường hợp này,
 root='./data': Đường dẫn đến thư mục nơi dữ liệu CIFAR-10 được tải mỗi batch sẽ chứa 10 mẫu
xuống và lưu trữ../data chỉ định rằng thư mục data nằm trong thư o shuffle=False: Đặt giá trị False để không trộn thứ tự các mẫu trong quá
mục làm việc hiện tại (thư mục mà script Python đang được thực trình lấy các batch
thi). o num_workers=2: Số lượng tiến trình công việc sẽ được sử dụng để tải dữ
 train=True: Đặt giá trị True để tải xuống tập dữ liệu huấn luyện liệu
CIFAR-10.
 download=True: Đặt giá trị True để tải xuống tập dữ liệu CIFAR-10 Huấn luyện mạng:
nếu chưa tồn tại trong thư mục root. //Định nghĩa các biến loss_history và avg_loss_history để lưu trữ giá trị loss trong
 transform=transform: Sử dụng biến transform đã được xây dựng quá trình huấn luyện
trước đó để chuyển đổi dữ liệu hình ảnh thành tensor và chuẩn hóa loss_history = []
- trainloader = DataLoader(trainset, batch_size=10, shuffle=True, avg_ loss_history = []
num_workers=2) Định nghĩa hàm mất mát và tối ưu hóa:
o Tạo một đối tượng trainloader từ trainset criterion = nn.CrossEntropyLoss()
o trainset: Đối tượng trainset đã được tạo từ CIFAR-10 dataset. optimizer = optim.SGD(net.parameter(), lr=0.001, momentum=0.9)
o batch_size=10: Kích thước của từng batch dữ liệu. Trong trường hợp này, (//- net.parameters(): Bao gồm các trọng số và bias của các lớp trong mạng.
mỗi batch sẽ chứa 10 mẫu. Điều này có nghĩa là mỗi lần tính toán và cập lr=0.001: Learning rate quyết định tốc độ và độ lớn của sự thay đổi trong quá trình
nhật gradient, mô hình sẽ được đưa vào 10 mẫu cùng một lúc. cập nhật tham số
o shuffle=True: Đặt giá trị `True` để trộn ngẫu nhiên thứ tự của các mẫu momentum=0.9: Tăng tốc quá trình hội tụ, trong khoảng từ 0 đến 1)
trong quá trình lấy các batch. Điều này giúp mô hình học được từ các mẫu for epoch in range(5): //Bắt đầu vòng lặp qua các epoch (trong trường hợp này là
đa dạng và tránh việc học theo thứ tự cố định của dữ liệu. 5)
o num_workers=2: Số lượng tiến trình công việc sẽ được sử dụng để tải dữ running_loss = 0.0 // tính tổng mất mát trong mỗi epoch của quá trình huấn
liệu. Trong trường hợp này, sử dụng 2 tiến trình công việc để tải dữ liệu. luyện
Điều này có thể cải thiện tốc độ tải dữ liệu bằng cách đồng thời tải các mẫu for i, data in enumerate(trainloader, 0): // Lặp qua từng batch trong
từ dataset. trainloader. Nếu trainloader chứa 1000 mẫu dữ liệu và kích thước batch là
o Sử dụng nó để lặp qua các batch dữ liệu trong quá trình huấn luyện mô hình 64, vòng lặp for sẽ được thực hiện 1000/64 = 16 lần
của mình. Mỗi lần lặp, `trainloader` sẽ trả về một batch gồm 10 mẫu được inputs, label = data
chọn ngẫu nhiên từ trainset. # Lấy chỉ 5 điểm dữ liệu từ batch
- testset = datasets.CIFAR10(root='./data', train=False, download=True, inputs = inputs[:5]
transform=transform) labels = labels[:5]
o Tạo một đối tượng testset từ CIFAR-10 dataset
optimizer.zero_grad() // Đặt gradient về 0 trước khi tính toán plt.xlabel(‘Epoch’)
gradient mới plt.ylabel(‘Loss’)
outputs = net(inputs) // Đưa dữ liệu qua mạng để tính toán đầu ra
loss = criterion(outputs, labels) // Tính giá trị loss bằng cách so plt.subplot(1, 2, 2)
sánh đầu ra với nhãn thật plt.plot(avg_loss_history)
loss.backward() //Tính gradient của loss và thực hiện quá trình lan plt.title(‘Average Loss per Epoch’)
truyền ngược plt.xlabel(‘Epoch’)
optimizer.step() //Cập nhật các trọng số mạng dựa trên gradient tính plt.ylabel(‘Loss’)
được
//Cập nhật giá trị running_loss và loss_history plt.tight_layout()
running_loss += loss.item() plt.show()
loss_history.append(loss.item()) //Đánh giá mô hình bằng các metrics như accuracy, precision, recall và confusion
// In ra giá trị loss trung bình sau mỗi 2000 batch matrix
if i % 2000 == 1999: from sklearn.metrics import accuracy_score, precision_score, recall_score,
print(‘[%d, %5d] loss: %3f ’ %(epoch +1, i+1, confusion_matrix
running_loss/2000))
running_loss = 0.0 net.eval()
- Điều kiện if i % 2000 == 1999 kiểm tra xem đã qua đi qua 2000 batch hay chưa.
Nếu i chia hết cho 2000 và có dư 1999 thì điều kiện này sẽ đúng, và dòng mã bên predictions = []
trong sẽ được thực thi. true_labels = []
- Khi điều kiện đúng, dòng mã print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1,
running_loss / 2000)) được thực thi. Dòng này in ra thông báo về giá trị mất mát
trung bình của 2000 batch gần nhất. Định dạng chuỗi '[...]' % (...) được sử dụng để Tìm tâm
lấy các giá trị (epoch + 1, i + 1, running_loss / 2000) và đưa vào chuỗi thông báo import numpy as np
để in ra màn hình. X_ = []
- epoch + 1 là chỉ số của epoch hiện tại được tăng lên 1 (đánh số từ 1), để đồng bộ Y_ = []
với cách số học thông thường. for i in range(h.shape[1]):
- i + 1 là chỉ số của batch hiện tại (từ 1 đến tổng số batch trong epoch). for j in range(h.shape[0]):
- running_loss / 2000 là giá trị mất mát trung bình của 2000 batch gần nhất. if binary[j, i] == 255:
running_loss là tổng mất mát tích lũy qua các batch, và chia cho 2000 để tính mất X_.append(i)
mát trung bình. Y_.append(j)
- Dòng mã running_loss = 0.0 được sử dụng để đặt lại giá trị của running_loss về print(np.mean(X_), np.mean(Y_))
0.0, để tính tổng mất mát mới cho 2000 batch tiếp theo
//Tính giá trị loss trung bình của toàn bộ tập trainloader và lưu vào
avg_loss_history Lan truyền ngược
avg_loss_history.append(running_loss/len(trainloader)) e x  y x  5, y  5, z  3
VD: Cho 3 . Vẽ lan truyền ngược và xuôi
//In ra thông báo khi quá trình huấn luyện kết thúc z 1
printf(‘ Finished Training ’) Giải
// Vẽ biểu đồ cho giá trị loss
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.plot(loss_history)
plt.title(‘Average Loss per Epoch’)
x y c
z3  d
ec  e x  y  a
z3  1  d  1  b
a
 f
b
a
d
df b
  0, 036
da da
a
d
df a
 b   2  0, 0012
db db b
df df da dec
   0, 036   0, 036ec  0, 036
dc da dc dc
df df db d  d  1
   0, 0012   0, 0012
dd db dd dd
df df da dc d  x  y
    0, 036  ec   0, 036
dx da dc dx dx
df df da dc d  x  y
    0, 036  ec   0, 036
dy da dc dy dx
df df db dd dz 3
    0, 0012   0, 0324
dz db dd dz dz

You might also like