Đọc mã nguồn mô hình, phần lớn là thao tác shape. Các hàm cần thuộc:
x = torch.randn(2, 3, 8) # (B, T, C)
x.view(2, 3, 2, 4) # tách C=8 thành (2 đầu, 4 chiều) — cần bộ nhớ liền
x.reshape(6, 8) # như view nhưng tự sao chép nếu cần
x.transpose(1, 2) # đổi 2 trục → (2, 8, 3)
x.permute(0, 2, 1) # sắp lại nhiều trục tùy ý
x.unsqueeze(1) # thêm trục độ dài 1 → (2, 1, 3, 8)
x.squeeze() # bỏ mọi trục độ dài 1
torch.cat([x, x], dim=-1) # nối theo trục có sẵn → (2, 3, 16)
torch.stack([x, x], dim=0) # tạo trục mới → (2, 2, 3, 8)Ví dụ kinh điển — tách đầu cho multi-head attention: (B, T, C) → view(B, T, h, C//h) → transpose(1, 2) → (B, h, T, C//h). Sau khi tính xong, làm ngược lại: transpose(1, 2).contiguous().view(B, T, C).
view báo lỗi "not contiguous" sau transpose/permute → thêm .contiguous() trước view, hoặc dùng reshape.
?x có shape (4, 10). x.unsqueeze(-1) có shape gì?
Luyện tập ngay
Viết code và chấm tự động — có trợ lý AI gợi ý khi bí.