Tạo môi trường riêng rồi gọi đúng Python trong môi trường. Không cần kích hoạt bằng một lệnh khác.
BƯỚC 02
Đặt một lô dữ liệu cố định vào cùng mạng
train và eval đổi hành vi của một số lớp, không tự bật hoặc tắt autograd. Dropout lấy mặt nạ ngẫu nhiên khi train, còn BatchNorm dùng thống kê lô dữ liệu và cập nhật running statistics.
Ta giữ nguyên đầu vào để thay đổi ở đầu ra có thể gắn với chế độ hoạt động, không phải dữ liệu khác nhau.
pytorch_train_eval.pyPhần 1/3
from pathlib import Path
import json
import numpy as np
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
OUTPUT = Path(__file__).resolve().parent / "results"
OUTPUT.mkdir(exist_ok=True)
plt.rcParams.update({"font.size": 12, "axes.spines.top": False,
"axes.spines.right": False, "figure.facecolor": "#f3f7f6",
"axes.facecolor": "white", "axes.titleweight": "bold"})
FIGURE = OUTPUT / "pytorch-train-eval.png"
import torch
from torch import nn
import torch.nn.functional as F
torch.manual_seed(7)
torch.set_num_threads(1)
x = torch.randn(16, 6) * 2 + 3
model = nn.Sequential(nn.BatchNorm1d(6), nn.Dropout(p=0.5), nn.Linear(6, 2))
model.train()
before = model[0].running_mean.clone()
train_a = model(x)
train_b = model(x)
assert not torch.allclose(train_a, train_b)
assert not torch.equal(before, model[0].running_mean)
print("Train outputs differ:", not torch.allclose(train_a, train_b))
Ý nghĩa đoạn mã
Hai lượt tính xuôi liên tiếp cập nhật running_mean hai lần và lấy mặt nạ Dropout khác nhau. Chưa có optimizer.step trong thí nghiệm này.
Điểm cần nhớ
Chế độ của lớp và chế độ tính gradient là hai khái niệm riêng.
BƯỚC 03
Eval cố định hành vi nhưng chưa tắt gradient
Khi eval, Dropout không bỏ ngẫu nhiên phần tử và BatchNorm dùng thống kê đã tích lũy. Nếu chỉ vừa chạy hai lô dữ liệu, thống kê đó chưa chắc đại diện cho dữ liệu.
no_grad hoặc inference_mode mới tắt việc ghi đồ thị cho dự đoán. Việc gọi eval trước rồi dùng inference_mode là một kết hợp phổ biến cho đánh giá.
requires_grad còn True trong eval vì tham số Linear vẫn cần gradient theo mặc định. inference_mode chỉ dùng cho phần không cần quay lại huấn luyện qua những phép tính đã thực hiện bên trong.
Điểm cần nhớ
Nhớ quay lại train trước epoch huấn luyện tiếp theo.
BƯỚC 04
So sánh đầu ra trên cùng mẫu
Ta vẽ điểm số đầu ra đầu tiên của mỗi mẫu qua bốn lần lượt tính xuôi. Những đường train khác nhau là hành vi dự kiến của Dropout, còn hai đường eval phải trùng.
Sự trùng nhau không chứng minh mô hình chính xác. Nó chỉ xác nhận tính nhất quán của quy trình đánh giá với đầu vào cố định.
Bạn sẽ đổi thứ tự các chiều tensor và xem cách PyTorch sắp dữ liệu trong bộ nhớ. Ví dụ giúp giải thích khi nào view không dùng được và contiguous có tác dụng gì.