tek4

CNN Layers

by - September. 21, 2021
Kiến thức
Machine Learning
Python
<p style="text-align: justify;">Trong b&agrave;i viết n&agrave;y, ch&uacute;ng ta sẽ t&igrave;m hiểu về c&aacute;c layers của CNN bằng c&aacute;ch x&acirc;y dựng một sự hiểu biết về c&aacute;c th&ocirc;ng số m&agrave; ch&uacute;ng ta đ&atilde; sử dụng khi x&acirc;y dựng ch&uacute;ng. Bắt đầu th&ocirc;i!</p> <p><img style="width: 588px; display: block; margin-left: auto; margin-right: auto;" src="http://tek4vn.2soft.top/public_files/cnn-layers-png-1" alt="CNN Layers" height="307" /></p> <h3 class="section-heading" style="text-align: justify;">CNN layers của ch&uacute;ng ta</h3> <p style="text-align: justify;">Trong b&agrave;i đăng trước, ch&uacute;ng ta đ&atilde; bắt đầu x&acirc;y dựng CNN của m&igrave;nh bằng c&aacute;ch mở rộng lớp <em>module</em> mạng neural PyTorch v&agrave; x&aacute;c định một số layers l&agrave;m thuộc t&iacute;nh.&nbsp;Ch&uacute;ng ta đ&atilde; x&aacute;c định hai lớp t&iacute;ch chập v&agrave; ba lớp tuyến t&iacute;nh bằng c&aacute;ch chỉ định ch&uacute;ng b&ecirc;n trong h&agrave;m tạo.</p> <pre class="language-python"><code>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</code></pre> <p style="text-align: justify;">Đối với mỗi layer, c&oacute; hai mục ch&iacute;nh được đ&oacute;ng g&oacute;i b&ecirc;n trong, một định nghĩa h&agrave;m foward v&agrave; một tensor trọng số.</p> <p style="text-align: justify;">Trọng số b&ecirc;n trong mỗi layer chứa c&aacute;c gi&aacute; trị trọng số được cập nhật khi mạng học được trong qu&aacute; tr&igrave;nh huấn luyện v&agrave; đ&acirc;y l&agrave; l&yacute; do ch&uacute;ng ta chỉ định c&aacute;c layer của m&igrave;nh l&agrave;m thuộc t&iacute;nh b&ecirc;n trong lớp <em>Network.</em></p> <p style="text-align: justify;">Lớp <em>module</em> mạng neural của PyTorch theo d&otilde;i c&aacute;c weight tensors b&ecirc;n trong mỗi layer. Code thực hiện theo d&otilde;i n&agrave;y nằm b&ecirc;n trong lớp <em>nn.Module</em> v&agrave; v&igrave; ch&uacute;ng ta đang mở rộng lớp <em>module</em> mạng neural n&ecirc;n ch&uacute;ng ta kế thừa chức năng n&agrave;y một c&aacute;ch tự động.</p> <p style="text-align: justify;">H&atilde;y nhớ rằng, kế thừa l&agrave; một trong những kh&aacute;i niệm hướng đối tượng m&agrave; ch&uacute;ng ta đ&atilde; n&oacute;i đến lần trước. Tất cả những g&igrave; ch&uacute;ng ta phải l&agrave;m để tận dụng chức năng n&agrave;y l&agrave; g&aacute;n c&aacute;c layer của ch&uacute;ng ta l&agrave;m c&aacute;c thuộc t&iacute;nh b&ecirc;n trong module mạng v&agrave; lớp cơ sở <em>module</em> sẽ thấy điều n&agrave;y v&agrave; đăng k&yacute; trọng số l&agrave;m c&aacute;c tham số c&oacute; thể học được của mạng.</p> <h3 class="section-heading" style="text-align: justify;">Tham số của CNN layer</h3> <p style="text-align: justify;">Mục ti&ecirc;u của ch&uacute;ng ta trong b&agrave;i đăng n&agrave;y l&agrave; hiểu r&otilde; hơn về c&aacute;c layers m&agrave; ch&uacute;ng ta đ&atilde; x&aacute;c định.&nbsp;ể l&agrave;m điều n&agrave;y, ch&uacute;ng ta sẽ t&igrave;m hiểu về c&aacute;c tham số v&agrave; gi&aacute; trị m&agrave; ch&uacute;ng ta đ&atilde; truyền cho c&aacute;c tham số n&agrave;y trong c&aacute;c h&agrave;m tạo layer.</p> <h4 class="sub-section-heading" style="text-align: justify;">Tham số v&agrave; đối số</h4> <p style="text-align: justify;">Đầu ti&ecirc;n, h&atilde;y l&agrave;m r&otilde; một số biệt ngữ li&ecirc;n quan đến c&aacute;c tham số n&oacute;i chung.&nbsp;Ch&uacute;ng ta thường nghe c&aacute;c từ tham số v&agrave; đối số, nhưng sự kh&aacute;c biệt giữa hai từ n&agrave;y l&agrave; g&igrave;?</p> <p style="text-align: justify;">C&aacute;c tham số của ch&uacute;ng ta sẽ được sử dụng trong c&aacute;c định nghĩa h&agrave;m dưới dạng place-holders trong khi c&aacute;c đối số l&agrave; c&aacute;c gi&aacute; trị thực tế được truyền đến h&agrave;m.</p> <p style="text-align: justify;">Trong trường hợp mạng của ch&uacute;ng ta, t&ecirc;n l&agrave; c&aacute;c tham số v&agrave; c&aacute;c gi&aacute; trị m&agrave; ch&uacute;ng ta đ&atilde; chỉ định l&agrave; c&aacute;c đối số.</p> <h4 class="sub-section-heading" style="text-align: justify;">Hai loại tham số</h4> <p style="text-align: justify;">Để hiểu r&otilde; hơn về gi&aacute; trị đối số cho c&aacute;c tham số n&agrave;y, h&atilde;y xem x&eacute;t hai danh mục hoặc loại tham số m&agrave; ch&uacute;ng ta đ&atilde; sử dụng khi x&acirc;y dựng c&aacute;c layers của m&igrave;nh.</p> <ol style="text-align: justify;"> <li>Si&ecirc;u tham số</li> <li>Si&ecirc;u tham số phụ thuộc v&agrave;o dữ liệu</li> </ol> <p style="text-align: justify;">Điều ch&iacute;nh cần nhớ về bất kỳ loại tham số n&agrave;o đ&oacute; l&agrave; tham số l&agrave; một&nbsp;place-holder&nbsp;cuối c&ugrave;ng sẽ giữ hoặc c&oacute; một gi&aacute; trị.</p> <p style="text-align: justify;">Mục ti&ecirc;u của c&aacute;c danh mục cụ thể n&agrave;y l&agrave; gi&uacute;p ch&uacute;ng ta nhớ c&aacute;ch quyết định gi&aacute; trị của mỗi tham số.</p> <p style="text-align: justify;">Khi ch&uacute;ng ta tạo một layer, ch&uacute;ng ta chuyển c&aacute;c gi&aacute; trị cho từng tham số đến phương thức khởi tạo của layer.&nbsp;Với c&aacute;c lớp t&iacute;ch chập c&oacute; ba tham số v&agrave; c&aacute;c lớp tuyến t&iacute;nh c&oacute; hai tham số.</p> <p style="text-align: justify;"><em>Convolutional layers</em></p> <ul style="text-align: justify;"> <li>in_channels</li> <li>out_channels</li> <li>kernel_size</li> </ul> <p style="text-align: justify;"><em>Linear layers</em></p> <ul style="text-align: justify;"> <li>in_features</li> <li>out_features</li> </ul> <p style="text-align: justify;">H&atilde;y xem c&aacute;c gi&aacute; trị cho c&aacute;c tham số được quyết định như thế n&agrave;o.&nbsp;Ch&uacute;ng ta sẽ bắt đầu bằng c&aacute;ch xem x&eacute;t c&aacute;c si&ecirc;u tham số v&agrave; sau đ&oacute;, ch&uacute;ng ta sẽ xem c&aacute;c si&ecirc;u tham số phụ thuộc v&agrave;o vị tr&iacute; như thế n&agrave;o.</p> <h4 class="sub-section-heading" style="text-align: justify;">Si&ecirc;u tham số</h4> <p style="text-align: justify;">N&oacute;i chung, si&ecirc;u tham số l&agrave; c&aacute;c tham số c&oacute; gi&aacute; trị được chọn thủ c&ocirc;ng v&agrave; t&ugrave;y &yacute;.</p> <p style="text-align: justify;">Để x&acirc;y dựng c&aacute;c layers CNN, đ&acirc;y l&agrave; c&aacute;c tham số ch&uacute;ng ta chọn theo c&aacute;ch thủ c&ocirc;ng:</p> <ul style="text-align: justify;"> <li>kernel_size</li> <li>out_channels</li> <li>out_features</li> </ul> <p style="text-align: justify;">Điều n&agrave;y c&oacute; nghĩa l&agrave; ch&uacute;ng ta chỉ cần chọn c&aacute;c gi&aacute; trị cho c&aacute;c tham số n&agrave;y.&nbsp;Trong lập tr&igrave;nh mạng neural, điều n&agrave;y kh&aacute; phổ biến v&agrave; ch&uacute;ng ta thường kiểm tra v&agrave; điều chỉnh c&aacute;c tham số n&agrave;y để t&igrave;m c&aacute;c gi&aacute; trị hoạt động tốt nhất.</p> <table class=" aligncenter"> <tbody> <tr> <td><strong>Tham số</strong></td> <td><strong>M&ocirc; tả</strong></td> </tr> <tr> <td>kernel_size</td> <td>Đặt k&iacute;ch thước&nbsp;filter.&nbsp;C&aacute;c từ kernel v&agrave; filter c&oacute; thể ho&aacute;n đổi cho nhau.</td> </tr> <tr> <td>out_channels</td> <td>Đặt số lượng&nbsp;filter.&nbsp;Một filter tạo ra một k&ecirc;nh đầu ra.</td> </tr> <tr> <td>out_features</td> <td>Đặt k&iacute;ch thước của tensor đầu ra.</td> </tr> </tbody> </table> <p style="text-align: justify;">Tr&ecirc;n m&ocirc; h&igrave;nh xuất hiện kh&aacute; thường xuy&ecirc;n l&agrave; ch&uacute;ng ta tăng <em>out_channels</em> khi ch&uacute;ng ta th&ecirc;m c&aacute;c conv layers bổ sung v&agrave; sau khi ch&uacute;ng ta chuyển sang c&aacute;c lớp tuyến t&iacute;nh, ch&uacute;ng ta thu nhỏ <em>out_features</em> của m&igrave;nh khi filter xuống số lượng c&aacute;c lớp đầu ra.</p> <p style="text-align: justify;">Tất cả c&aacute;c tham số n&agrave;y ảnh hưởng đến kiến ​​tr&uacute;c mạng của ch&uacute;ng ta.&nbsp;Cụ thể, c&aacute;c tham số n&agrave;y t&aacute;c động trực tiếp đến weight tensors b&ecirc;n trong c&aacute;c layers.&nbsp;Ch&uacute;ng ta sẽ đi s&acirc;u hơn v&agrave;o vấn đề n&agrave;y trong b&agrave;i đăng tiếp theo khi ch&uacute;ng ta n&oacute;i về c&aacute;c tham số c&oacute; thể học được v&agrave; kiểm tra weight tensors, nhưng hiện tại, h&atilde;y đề cập đến c&aacute;c si&ecirc;u tham số phụ thuộc.</p> <h4 class="sub-section-heading" style="text-align: justify;">Si&ecirc;u tham số phụ thuộc dữ liệu</h4> <p style="text-align: justify;">Si&ecirc;u tham số phụ thuộc dữ liệu l&agrave; c&aacute;c tham số c&oacute; gi&aacute; trị phụ thuộc v&agrave;o dữ liệu.&nbsp;Hai si&ecirc;u tham số phụ thuộc v&agrave;o dữ liệu đầu ti&ecirc;n l&agrave; <em>in_channels</em> của layer chập đầu ti&ecirc;n v&agrave; <em>out_features</em> của layer đầu ra.</p> <p style="text-align: justify;">Bạn thấy đ&oacute;, c&aacute;c k&ecirc;nh <em>in_channels</em> của layer chập đầu ti&ecirc;n phụ thuộc v&agrave;o số lượng c&aacute;c k&ecirc;nh m&agrave;u c&oacute; b&ecirc;n trong c&aacute;c h&igrave;nh ảnh tạo n&ecirc;n tập huấn luyện.&nbsp;V&igrave; ch&uacute;ng ta đang xử l&yacute; h&igrave;nh ảnh thang độ x&aacute;m n&ecirc;n ch&uacute;ng ta biết rằng gi&aacute; trị n&agrave;y phải l&agrave; 1.</p> <p style="text-align: justify;">C&aacute;c <em>out_features</em> cho layer đầu ra phụ thuộc v&agrave;o số lượng lớp c&oacute; b&ecirc;n trong tập huấn luyện của ch&uacute;ng ta.&nbsp;V&igrave; ch&uacute;ng ta c&oacute; 10 loại quần &aacute;o b&ecirc;n trong tập dữ liệu Fashion-MNIST n&ecirc;n ch&uacute;ng ta biết rằng ch&uacute;ng ta cần 10 features đầu ra.</p> <p style="text-align: justify;">N&oacute;i chung, đầu v&agrave;o cho một layer l&agrave; đầu ra từ layer trước v&agrave; do đ&oacute;, tất cả c&aacute;c k&ecirc;nh <em>in_channels</em> trong c&aacute;c layers chuyển đổi v&agrave; <em>in_features</em> trong c&aacute;c layers tuyến t&iacute;nh phụ thuộc v&agrave;o dữ liệu đến từ layer trước đ&oacute;.</p> <p style="text-align: justify;">Khi ch&uacute;ng ta chuyển từ layer chuyển đổi sang layer tuyến t&iacute;nh, ch&uacute;ng ta phải l&agrave;m phẳng (flatten) tensor của m&igrave;nh.&nbsp;Đ&acirc;y l&agrave; l&yacute; do tại sao ch&uacute;ng t&ocirc;i c&oacute; 12 x 4 x 4. 12 đến từ số lượng k&ecirc;nh đầu ra ở layer trước, nhưng tại sao ch&uacute;ng ta lại c&oacute; hai số 4?&nbsp;Ch&uacute;ng ta sẽ đề cập đến c&aacute;ch ch&uacute;ng ta nhận được những gi&aacute; trị n&agrave;y trong một b&agrave;i đăng trong tương lai.</p> <h4 class="sub-section-heading" style="text-align: justify;">T&oacute;m tắt c&aacute;c tham số layer</h4> <p style="text-align: justify;">Ch&uacute;ng ta sẽ t&igrave;m hiểu th&ecirc;m về hoạt động b&ecirc;n trong mạng của ch&uacute;ng ta v&agrave; c&aacute;ch c&aacute;c tensor chạy qua mạng khi ch&uacute;ng ta triển khai h&agrave;m <em>forward().&nbsp;</em>B&acirc;y giờ, h&atilde;y xem bảng m&ocirc; tả từng tham số n&agrave;y, để đảm bảo bạn c&oacute; thể hiểu c&aacute;ch x&aacute;c định từng gi&aacute; trị tham số.</p> <pre class="language-python"><code>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)</code></pre> <table class=" aligncenter"> <tbody> <tr> <td style="text-align: center;"><strong>Layer</strong></td> <td style="text-align: center;"><strong>T&ecirc;n tham số</strong></td> <td style="text-align: center;"><strong>Gi&aacute; trị tham số</strong></td> <td style="text-align: center;"><strong>Gi&aacute; trị tham số l&agrave;</strong></td> </tr> <tr> <td>conv1</td> <td>in_channels</td> <td>1</td> <td>Số lượng k&ecirc;nh m&agrave;u trong h&igrave;nh ảnh đầu v&agrave;o</td> </tr> <tr> <td>conv1</td> <td>kernel_size</td> <td>5</td> <td>Một si&ecirc;u tham số</td> </tr> <tr> <td>conv1</td> <td>out_channels</td> <td>6</td> <td>Một si&ecirc;u tham số</td> </tr> <tr> <td>conv2</td> <td>in_channels</td> <td>6</td> <td>Số k&ecirc;nh out_channels trong layer trước</td> </tr> <tr> <td>conv2</td> <td>kernel_size</td> <td>5</td> <td>Một si&ecirc;u tham số.</td> </tr> <tr> <td>conv2</td> <td>out_channels</td> <td>12</td> <td>Si&ecirc;u tham số (cao hơn layer chuyển đổi trước đ&oacute;).</td> </tr> <tr> <td>fc1</td> <td>in_features</td> <td>12x4x4</td> <td>Độ d&agrave;i của đầu ra được l&agrave;m phẳng từ layer trước.</td> </tr> <tr> <td>fc1</td> <td>out_features</td> <td>120</td> <td>Một si&ecirc;u tham số.</td> </tr> <tr> <td>fc2</td> <td>in_features</td> <td>120</td> <td>Số lượng out_features của layer trước.</td> </tr> <tr> <td>fc2</td> <td>out_features</td> <td>60</td> <td>Một si&ecirc;u tham số (thấp hơn layer tuyến t&iacute;nh trước đ&oacute;).</td> </tr> <tr> <td>out</td> <td>in_features</td> <td>60</td> <td>Số k&ecirc;nh out_channels trong layer trước.</td> </tr> <tr> <td>out</td> <td>out_features</td> <td>10</td> <td>Số lượng c&aacute;c lớp dự đo&aacute;n.</td> </tr> </tbody> </table> <h3 style="text-align: justify;">Kết Luận</h3> <p style="text-align: justify;">Trong b&agrave;i tiếp theo, ch&uacute;ng ta sẽ t&igrave;m hiểu về c&aacute;c tham số c&oacute; thể học được, l&agrave; c&aacute;c tham số c&oacute; gi&aacute; trị được học trong qu&aacute; tr&igrave;nh đ&agrave;o tạo. Hẹn gặp lại bạn trong b&agrave;i viết sau!</p> <p style="text-align: justify;">&nbsp;</p> <hr /> <p style="text-align: center;"><em><strong>Fanpage Facebook:</strong>&nbsp;<a href="https://www.facebook.com/tek4.vn/">TEK4.VN</a></em>&nbsp;</p> <p style="text-align: center;"><em><strong>Tham gia cộng đồng để chia sẻ, trao đổi v&agrave; thảo luận:</strong>&nbsp;<a href="https://www.facebook.com/groups/tek4.vn/">TEK4.VN - Học Lập Tr&igrave;nh Miễn Ph&iacute;</a></em></p>