Chào mừng các bạn đến với bài viết thứ 17 trong loạt bài về Lập Trình Neural Network Với Pytorch. Trong bài viết này, chúng ta sẽ tìm hiểu về các layers của CNN bằng cách xây dựng một sự hiểu biết về các thông số mà chúng ta đã sử dụng khi xây dựng chúng. Bắt đầu thôi!
CNN layers của chúng ta
Trong bài đăng trước, chúng ta đã bắt đầu xây dựng CNN của mình bằng cách mở rộng lớp module mạng neural PyTorch và xác định một số layers làm thuộc tính. Chúng ta đã xác định hai lớp tích chập và ba lớp tuyến tính bằng cách chỉ định chúng bên trong hàm tạo.
class Network(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(in_channels=1, out_channels=6, kernel_size=5)
self.conv2 = nn.Conv2d(in_channels=6, out_channels=12, kernel_size=5)
self.fc1 = nn.Linear(in_features=12*4*4, out_features=120)
self.fc2 = nn.Linear(in_features=120, out_features=60)
self.out = nn.Linear(in_features=60, out_features=10)
def forward(self, t):
# implement the forward pass
return t
Đối với mỗi layer, có hai mục chính được đóng gói bên trong, một định nghĩa hàm foward và một tensor trọng số.
Trọng số bên trong mỗi layer chứa các giá trị trọng số được cập nhật khi mạng học được trong quá trình huấn luyện và đây là lý do chúng ta chỉ định các layer của mình làm thuộc tính bên trong lớp Network.
Lớp module mạng neural của PyTorch theo dõi các weight tensors bên trong mỗi layer. Code thực hiện theo dõi này nằm bên trong lớp nn.Module và vì chúng ta đang mở rộng lớp module mạng neural nên chúng ta kế thừa chức năng này một cách tự động.
Hãy nhớ rằng, kế thừa là một trong những khái niệm hướng đối tượng mà chúng ta đã nói đến lần trước. Tất cả những gì chúng ta phải làm để tận dụng chức năng này là gán các layer của chúng ta làm các thuộc tính bên trong module mạng và lớp cơ sở module sẽ thấy điều này và đăng ký trọng số làm các tham số có thể học được của mạng.
Tham số của CNN layer
Mục tiêu của chúng ta trong bài đăng này là hiểu rõ hơn về các layers mà chúng ta đã xác định. ể làm điều này, chúng ta sẽ tìm hiểu về các tham số và giá trị mà chúng ta đã truyền cho các tham số này trong các hàm tạo layer.
Tham số và đối số
Đầu tiên, hãy làm rõ một số biệt ngữ liên quan đến các tham số nói chung. Chúng ta thường nghe các từ tham số và đối số, nhưng sự khác biệt giữa hai từ này là gì?
Các tham số của chúng ta sẽ được sử dụng trong các định nghĩa hàm dưới dạng place-holders trong khi các đối số là các giá trị thực tế được truyền đến hàm.
Trong trường hợp mạng của chúng ta, tên là các tham số và các giá trị mà chúng ta đã chỉ định là các đối số.
Hai loại tham số
Để hiểu rõ hơn về giá trị đối số cho các tham số này, hãy xem xét hai danh mục hoặc loại tham số mà chúng ta đã sử dụng khi xây dựng các layers của mình.
- Siêu tham số
- Siêu tham số phụ thuộc vào dữ liệu
Điều chính cần nhớ về bất kỳ loại tham số nào đó là tham số là một place-holder cuối cùng sẽ giữ hoặc có một giá trị.
Mục tiêu của các danh mục cụ thể này là giúp chúng ta nhớ cách quyết định giá trị của mỗi tham số.
Khi chúng ta tạo một layer, chúng ta chuyển các giá trị cho từng tham số đến phương thức khởi tạo của layer. Với các lớp tích chập có ba tham số và các lớp tuyến tính có hai tham số.
Convolutional layers
- in_channels
- out_channels
- kernel_size
Linear layers
- in_features
- out_features
Hãy xem các giá trị cho các tham số được quyết định như thế nào. Chúng ta sẽ bắt đầu bằng cách xem xét các siêu tham số và sau đó, chúng ta sẽ xem các siêu tham số phụ thuộc vào vị trí như thế nào.
Siêu tham số
Nói chung, siêu tham số là các tham số có giá trị được chọn thủ công và tùy ý.
Để xây dựng các layers CNN, đây là các tham số chúng ta chọn theo cách thủ công:
- kernel_size
- out_channels
- out_features
Điều này có nghĩa là chúng ta chỉ cần chọn các giá trị cho các tham số này. Trong lập trình mạng neural, điều này khá phổ biến và chúng ta thường kiểm tra và điều chỉnh các tham số này để tìm các giá trị hoạt động tốt nhất.
Tham số | Mô tả |
kernel_size | Đặt kích thước filter. Các từ kernel và filter có thể hoán đổi cho nhau. |
out_channels | Đặt số lượng filter. Một filter tạo ra một kênh đầu ra. |
out_features | Đặt kích thước của tensor đầu ra. |
Trên mô hình xuất hiện khá thường xuyên là chúng ta tăng out_channels khi chúng ta thêm các conv layers bổ sung và sau khi chúng ta chuyển sang các lớp tuyến tính, chúng ta thu nhỏ out_features của mình khi filter xuống số lượng các lớp đầu ra.
Tất cả các tham số này ảnh hưởng đến kiến trúc mạng của chúng ta. Cụ thể, các tham số này tác động trực tiếp đến weight tensors bên trong các layers. Chúng ta sẽ đi sâu hơn vào vấn đề này trong bài đăng tiếp theo khi chúng ta nói về các tham số có thể học được và kiểm tra weight tensors, nhưng hiện tại, hãy đề cập đến các siêu tham số phụ thuộc.
Siêu tham số phụ thuộc dữ liệu
Siêu tham số phụ thuộc dữ liệu là các tham số có giá trị phụ thuộc vào dữ liệu. Hai siêu tham số phụ thuộc vào dữ liệu đầu tiên là in_channels của layer chập đầu tiên và out_features của layer đầu ra.
Bạn thấy đó, các kênh in_channels của layer chập đầu tiên phụ thuộc vào số lượng các kênh màu có bên trong các hình ảnh tạo nên tập huấn luyện. Vì chúng ta đang xử lý hình ảnh thang độ xám nên chúng ta biết rằng giá trị này phải là 1.
Các out_features cho layer đầu ra phụ thuộc vào số lượng lớp có bên trong tập huấn luyện của chúng ta. Vì chúng ta có 10 loại quần áo bên trong tập dữ liệu Fashion-MNIST nên chúng ta biết rằng chúng ta cần 10 features đầu ra.
Nói chung, đầu vào cho một layer là đầu ra từ layer trước và do đó, tất cả các kênh in_channels trong các layers chuyển đổi và in_features trong các layers tuyến tính phụ thuộc vào dữ liệu đến từ layer trước đó.
Khi chúng ta chuyển từ layer chuyển đổi sang layer tuyến tính, chúng ta phải làm phẳng (flatten) tensor của mình. Đây là lý do tại sao chúng tôi có 12 x 4 x 4. 12 đến từ số lượng kênh đầu ra ở layer trước, nhưng tại sao chúng ta lại có hai số 4? Chúng ta sẽ đề cập đến cách chúng ta nhận được những giá trị này trong một bài đăng trong tương lai.
Tóm tắt các tham số layer
Chúng ta sẽ tìm hiểu thêm về hoạt động bên trong mạng của chúng ta và cách các tensor chạy qua mạng khi chúng ta triển khai hàm forward(). Bây giờ, hãy xem bảng mô tả từng tham số này, để đảm bảo bạn có thể hiểu cách xác định từng giá trị tham số.
self.conv1 = nn.Conv2d(in_channels=1, out_channels=6, kernel_size=5)
self.conv2 = nn.Conv2d(in_channels=6, out_channels=12, kernel_size=5)
self.fc1 = nn.Linear(in_features=12 * 4 * 4, out_features=120)
self.fc2 = nn.Linear(in_features=120, out_features=60)
self.out = nn.Linear(in_features=60, out_features=10)
Layer | Tên tham số | Giá trị tham số | Giá trị tham số là |
conv1 | in_channels | 1 | Số lượng kênh màu trong hình ảnh đầu vào |
conv1 | kernel_size | 5 | Một siêu tham số |
conv1 | out_channels | 6 | Một siêu tham số |
conv2 | in_channels | 6 | Số kênh out_channels trong layer trước |
conv2 | kernel_size | 5 | Một siêu tham số. |
conv2 | out_channels | 12 | Siêu tham số (cao hơn layer chuyển đổi trước đó). |
fc1 | in_features | 12x4x4 | Độ dài của đầu ra được làm phẳng từ layer trước. |
fc1 | out_features | 120 | Một siêu tham số. |
fc2 | in_features | 120 | Số lượng out_features của layer trước. |
fc2 | out_features | 60 | Một siêu tham số (thấp hơn layer tuyến tính trước đó). |
out | in_features | 60 | Số kênh out_channels trong layer trước. |
out | out_features | 10 | Số lượng các lớp dự đoán. |
Kết Luận
Trong bài tiếp theo, chúng ta sẽ tìm hiểu về các tham số có thể học được, là các tham số có giá trị được học trong quá trình đào tạo. Hẹn gặp lại bạn trong bài viết sau!
One Comment
Anh Tú Trần
Hay