Tài nguyên

Cheat sheet PyTorch: tensor, lớp mạng, huấn luyện, xuất mô hình

Tra cứu nhanh tensor, GPU, lớp mạng, hàm mất mát, vòng lặp huấn luyện, lưu tải mô hình và các lỗi hay gặp.

Cheat sheet PyTorch: tensor, lớp mạng, huấn luyện, xuất mô hình
Nội dung bài viết
  1. Tensor
  2. GPU
  3. Lớp mạng thường dùng
  4. Hàm mất mát và bộ tối ưu
  5. Vòng lặp huấn luyện tối thiểu
  6. Dữ liệu
  7. Lưu, tải và xuất
  8. Lỗi hay gặp

Trang tra cứu nhanh các lệnh PyTorch thường dùng khi huấn luyện và triển khai mô hình thị giác máy. Giả định đã có import torch, from torch import nn.

Tensor

Việc cần làmCode
Tạo tensortorch.tensor([1, 2]), torch.zeros(2, 3), torch.randn(8, 3, 224, 224)
Từ / sang NumPytorch.from_numpy(arr) / t.cpu().numpy()
Kích thước, kiểu, thiết bịt.shape, t.dtype, t.device
Đổi hình dạngt.view(8, -1), t.reshape(...), t.flatten(1)
Đổi thứ tự chiều HWC → CHWt.permute(2, 0, 1)
Thêm / bỏ chiềut.unsqueeze(0) / t.squeeze()
Ghéptorch.cat([a, b], dim=0), torch.stack([a, b])

GPU

Việc cần làmCode
Kiểm tra GPUtorch.cuda.is_available(), torch.cuda.get_device_name(0)
Chọn thiết bịdevice = "cuda" if torch.cuda.is_available() else "cpu"
Chuyển mô hình, dữ liệumodel.to(device), x.to(device)
Bộ nhớ GPU đang dùngtorch.cuda.memory_allocated() / 1e9 (GB)

Lớp mạng thường dùng

LớpGhi chú
nn.Conv2d(cin, cout, k, stride, padding)Tích chập 2D
nn.BatchNorm2d(c), nn.ReLU()Chuẩn hóa, kích hoạt
nn.MaxPool2d(2), nn.AdaptiveAvgPool2d(1)Giảm kích thước
nn.Linear(in, out)Lớp kết nối đầy đủ
nn.Dropout(0.3)Chống overfitting
nn.Sequential(...)Ghép các lớp nối tiếp

Hàm mất mát và bộ tối ưu

Bài toánHàm mất mát
Phân loại nhiều lớpnn.CrossEntropyLoss() (đầu vào là logits, chưa softmax)
Nhị phân / đa nhãn / mặt nạnn.BCEWithLogitsLoss()
Hồi quynn.MSELoss(), nn.SmoothL1Loss()
optimizer = torch.optim.AdamW(model.parameters(), lr=1e-3, weight_decay=1e-4)
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=epochs)

Vòng lặp huấn luyện tối thiểu

for epoch in range(epochs):
    model.train()
    for x, y in train_loader:
        x, y = x.to(device), y.to(device)
        optimizer.zero_grad()
        loss = criterion(model(x), y)
        loss.backward()
        optimizer.step()
    scheduler.step()

    model.eval()
    with torch.no_grad():
        ...   # đánh giá trên tập validation

Dữ liệu

Việc cần làmCode
Thư mục ảnh theo lớptorchvision.datasets.ImageFolder("data/train", transform)
DataLoaderDataLoader(ds, batch_size=32, shuffle=True, num_workers=4)
Biến đổi ảnhtransforms.Compose([transforms.Resize((224, 224)), transforms.ToTensor()])

Lưu, tải và xuất

Việc cần làmCode
Lưu trọng sốtorch.save(model.state_dict(), "model.pt")
Tải trọng sốmodel.load_state_dict(torch.load("model.pt", map_location=device))
Xuất ONNXtorch.onnx.export(model, dummy_input, "model.onnx", input_names=["input"], output_names=["output"])
Đếm tham sốsum(p.numel() for p in model.parameters())

Lỗi hay gặp

  • Expected all tensors to be on the same device: quên chuyển dữ liệu hoặc mô hình sang GPU.
  • CUDA out of memory: giảm batch size, giảm kích thước ảnh, dùng torch.no_grad() khi đánh giá.
  • Kết quả khi đánh giá thay đổi bất thường: quên model.eval().
  • Loss không giảm: kiểm tra learning rate, nhãn có khớp ảnh không, đã gọi optimizer.zero_grad() chưa.

Bài giải thích chi tiết: PyTorch cơ bản: tensor, autograd và vòng lặp huấn luyện.

Ban biên tập HọcFree

Chúng tôi viết những bài hướng dẫn dễ hiểu, thực tế để ai cũng có thể tự học lập trình và ngoại ngữ, hoàn toàn miễn phí.