tek4

Chuẩn Bị Dữ Liệu Trong Pytorch

by - September. 21, 2021
Kiến thức
Machine Learning
Python
<p style="text-align: justify;">B&agrave;i viết n&agrave;y sẽ tr&igrave;nh b&agrave;y về quy tr&igrave;nh chuẩn bị dữ liệu cho dự &aacute;n, bao gồm quy tr&igrave;nh tr&iacute;ch xuất (extract), chuyển đổi (transform) v&agrave; tải (load), bằng c&aacute;ch sử dụng torchvision - g&oacute;i thị gi&aacute;c m&aacute;y t&iacute;nh của PyTorch d&agrave;nh cho học m&aacute;y. Bắt đầu th&ocirc;i!</p> <p><img style="width: 592px; display: block; margin-left: auto; margin-right: auto;" src="http://tek4vn.2soft.top/public_files/chuan-bi-du-lieu-png-1" alt="Chuẩn Bị Dữ Liệu" height="310" /></p> <h3 class="sub-section-heading" style="text-align: justify;">Quy Tr&igrave;nh ETL</h3> <p style="text-align: justify;">Để chuẩn bị dữ liệu&nbsp;ch&uacute;ng ta sẽ l&agrave;m theo những g&igrave; được gọi l&agrave; quy tr&igrave;nh ETL:</p> <ul style="text-align: justify;"> <li><strong>E</strong>xtract (Tr&iacute;ch xuất dữ liệu từ một nguồn dữ liệu)</li> <li><strong>T</strong>ransform (Chuyển đổi dữ liệu sang định dạng mong muốn)</li> <li><strong>L</strong>oad (Tải dữ liệu v&agrave;o một cấu tr&uacute;c ph&ugrave; hợp).</li> </ul> <p style="text-align: justify;">Quy tr&igrave;nh ETL c&oacute; thể được coi l&agrave; một quy tr&igrave;nh fractal v&igrave; n&oacute; c&oacute; thể được &aacute;p dụng tr&ecirc;n nhiều quy m&ocirc; kh&aacute;c nhau.&nbsp;Quy tr&igrave;nh c&oacute; thể được &aacute;p dụng ở quy m&ocirc; nhỏ, như một chương tr&igrave;nh đơn lẻ hoặc tr&ecirc;n quy m&ocirc; lớn, cho đến cấp doanh nghiệp, nơi c&oacute; c&aacute;c hệ thống khổng lồ xử l&yacute; từng bộ phận ri&ecirc;ng lẻ.</p> <p style="text-align: justify;">Khi ch&uacute;ng ta đ&atilde; ho&agrave;n th&agrave;nh quy tr&igrave;nh ETL, tức l&agrave; ch&uacute;ng ta đ&atilde; sẵn s&agrave;ng bắt đầu x&acirc;y dựng v&agrave; đ&agrave;o tạo m&ocirc; h&igrave;nh Deep learning của m&igrave;nh.&nbsp;PyTorch c&oacute; một số g&oacute;i v&agrave; lớp t&iacute;ch hợp gi&uacute;p qu&aacute; tr&igrave;nh ETL trở n&ecirc;n kh&aacute; dễ d&agrave;ng.</p> <h4 class="sub-section-heading" style="text-align: justify;">PyTorch Imports</h4> <p style="text-align: justify;">Ch&uacute;ng ta bắt đầu bằng c&aacute;ch import tất cả c&aacute;c thư viện PyTorch cần thiết:</p> <pre class="language-python"><code>import torch import torch.nn as nn import torch.optim as optim import torch.nn.functional as F import torchvision import torchvision.transforms as transforms</code></pre> <p style="text-align: justify;">Bảng dưới đ&acirc;y sẽ m&ocirc; tả từng g&oacute;i tr&ecirc;n:</p> <table class=" aligncenter"> <tbody> <tr> <td><strong>Package</strong></td> <td><strong>M&ocirc; Tả&nbsp;&nbsp;</strong></td> </tr> <tr> <td>torch</td> <td>PyTorch package cấp cao nhất&nbsp;v&agrave; thư viện tensor.</td> </tr> <tr> <td>torch.nn</td> <td>Một&nbsp;subpackage chứa c&aacute;c&nbsp;modules v&agrave; c&aacute;c&nbsp;classes&nbsp;c&oacute; thể mở rộng để x&acirc;y dựng mạng neural.</td> </tr> <tr> <td>torch.optim</td> <td>Một subpackage&nbsp;chứa c&aacute;c hoạt động tối ưu h&oacute;a ti&ecirc;u chuẩn như SGD v&agrave; Adam.</td> </tr> <tr> <td>torch.nn.functional</td> <td>Một functional interface&nbsp;chứa c&aacute;c hoạt động điển h&igrave;nh được sử dụng để x&acirc;y dựng mạng neural như&nbsp;loss functions, activation functions v&agrave; convolution operations.</td> </tr> <tr> <td>torchvision</td> <td>Một package cung cấp quyền truy cập v&agrave;o c&aacute;c tập dữ liệu phổ biến, kiến ​​tr&uacute;c m&ocirc; h&igrave;nh v&agrave; c&aacute;c ph&eacute;p biến đổi h&igrave;nh ảnh cho thị gi&aacute;c m&aacute;y t&iacute;nh.</td> </tr> <tr> <td>torchvision.transforms</td> <td>Một giao diện chứa c&aacute;c biến đổi chung để xử l&yacute; h&igrave;nh ảnh.</td> </tr> </tbody> </table> <h4 style="text-align: justify;">Chuẩn bị dữ liệu bằng pytorch</h4> <p style="text-align: justify;">Mục ti&ecirc;u cuối c&ugrave;ng của ch&uacute;ng ta khi chuẩn bị dữ liệu l&agrave; thực hiện những việc sau (ETL):</p> <ul style="text-align: justify;"> <li><strong>E</strong>xtract:&nbsp;Tr&iacute;ch xuất - Lấy dữ liệu h&igrave;nh ảnh Fashion-MNIST từ nguồn.</li> <li><strong>T</strong>ransform:&nbsp;Chuyển đổi - Đưa dữ liệu của ch&uacute;ng ta sang dạng tensor.</li> <li><strong>L</strong>oad:&nbsp;Tải - Đưa dữ liệu của ch&uacute;ng ta v&agrave;o một đối tượng để dễ d&agrave;ng truy cập.</li> </ul> <p style="text-align: justify;">V&igrave; những mục đ&iacute;ch n&agrave;y, PyTorch cung cấp cho ch&uacute;ng ta hai lớp sau:</p> <table class=" aligncenter"> <tbody> <tr> <td style="text-align: center;"><strong>Class</strong></td> <td><strong>M&ocirc; tả</strong></td> </tr> <tr> <td>torch.utils.data.Dataset</td> <td>Một lớp trừu tượng để biểu diễn một tập dữ liệu.</td> </tr> <tr> <td>torch.utils.data.DataLoader</td> <td>Chứa&nbsp;một tập dữ liệu v&agrave; cung cấp quyền truy cập v&agrave;o dữ liệu cơ bản.</td> </tr> </tbody> </table> <p style="text-align: justify;">Lớp<a href="https://docs.python.org/3/library/abc.html" target="_blank" rel="noopener"><em> trừu tượng</em></a> l&agrave; một lớp Python c&oacute; c&aacute;c phương thức m&agrave; ch&uacute;ng ta phải triển khai, v&igrave; vậy ch&uacute;ng ta c&oacute; thể tạo một tập dữ liệu t&ugrave;y chỉnh bằng c&aacute;ch tạo một subclass mở rộng chức năng của lớp Dataset.</p> <p style="text-align: justify;">Để tạo tập dữ liệu t&ugrave;y chỉnh bằng PyTorch, ch&uacute;ng ta mở rộng lớp Dataset bằng c&aacute;ch tạo một lớp con triển khai c&aacute;c phương thức bắt buộc n&agrave;y.&nbsp;Khi thực hiện việc n&agrave;y, lớp con mới của ch&uacute;ng ta sau đ&oacute; c&oacute; thể được chuyển đến đối tượng PyTorch <em>DataLoader.</em></p> <p style="text-align: justify;">Ch&uacute;ng ta sẽ sử dụng tập dữ liệu fashion-MNIST được t&iacute;ch hợp sẵn với g&oacute;i torchvision, v&igrave; vậy ch&uacute;ng ta sẽ kh&ocirc;ng phải l&agrave;m điều n&agrave;y cho dự &aacute;n của m&igrave;nh.</p> <h3 class="section-heading" style="text-align: justify;">PyTorch Torchvision Package</h3> <p style="text-align: justify;">G&oacute;i <em>torchvision,</em> cung cấp cho ch&uacute;ng ta quyền truy cập v&agrave;o c&aacute;c t&agrave;i nguy&ecirc;n sau:</p> <ul style="text-align: justify;"> <li>Datasets (như MNIST v&agrave; Fashion-MNIST)</li> <li>Models&nbsp; (như VGG16)</li> <li>Transforms</li> <li>Utils</li> </ul> <h4 class="sub-section-heading" style="text-align: justify;">Thị gi&aacute;c m&aacute;y t&iacute;nh (computer vision)</h4> <p style="text-align: justify;">Tất cả c&aacute;c t&agrave;i nguy&ecirc;n n&agrave;y đều li&ecirc;n quan đến c&aacute;c nhiệm vụ thị gi&aacute;c m&aacute;y t&iacute;nh.</p> <p style="text-align: justify;">Khi ch&uacute;ng ta t&igrave;m hiểu về tập dữ liệu Fashion-MNIST trong b&agrave;i đăng trước, b&agrave;i b&aacute;o arXiv giới thiệu tập dữ liệu fashion đ&atilde; chỉ ra rằng c&aacute;c t&aacute;c giả muốn n&oacute; trở th&agrave;nh một tệp thay thế cho tập dữ liệu MNIST ban đầu.</p> <p style="text-align: justify;">&Yacute; tưởng l&agrave; để c&aacute;c frameworks như PyTorch c&oacute; thể th&ecirc;m Fashion-MNIST bằng c&aacute;ch chỉ cần thay đổi URL để truy xuất dữ liệu.</p> <p style="text-align: justify;">Dưới đ&acirc;y l&agrave; định nghĩa lớp torchvision của pytorch từ&nbsp;source code:</p> <pre class="language-python"><code>class FashionMNIST(MNIST): """`Fashion-MNIST &lt;https://github.com/zalandoresearch/fashion-mnist&gt;`_ Dataset. Args: root (string): Root directory of dataset where ``processed/training.pt`` and ``processed/test.pt`` exist. train (bool, optional): If True, creates dataset from ``training.pt``, otherwise from ``test.pt``. download (bool, optional): If true, downloads the dataset from the internet and puts it in root directory. If dataset is already downloaded, it is not downloaded again. transform (callable, optional): A function/transform that takes in an PIL image and returns a transformed version. E.g, ``transforms.RandomCrop`` target_transform (callable, optional): A function/transform that takes in the target and transforms it. """ urls = [ 'http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-images-idx3-ubyte.gz', 'http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-labels-idx1-ubyte.gz', 'http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-images-idx3-ubyte.gz', 'http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-labels-idx1-ubyte.gz', ]</code></pre> <h4 class="sub-section-heading" style="text-align: justify;">PyTorch Dataset Class</h4> <p style="text-align: justify;">Để c&oacute; được một phi&ecirc;n bản của tập dữ liệu FashionMNIST bằng c&aacute;ch sử dụng <em>torchvision,</em> ch&uacute;ng ta l&agrave;m như sau:</p> <pre class="language-python"><code>train_set = torchvision.datasets.FashionMNIST( root='./data' ,train=True ,download=True ,transform=transforms.Compose([ transforms.ToTensor() ]) )</code></pre> <p style="text-align: justify;">Lưu &yacute; rằng tham số <em>root</em> từng l&agrave; '<em>./data/FashionMNIST</em>', tuy nhi&ecirc;n, đối số n&agrave;y đ&atilde; thay đổi do cập nhật <em>torchvision.</em></p> <p style="text-align: justify;">Ch&uacute;ng ta chỉ định c&aacute;c tham số số sau:</p> <table class=" aligncenter"> <tbody> <tr> <td><strong>Tham số</strong></td> <td><strong>M&ocirc; tả</strong></td> </tr> <tr> <td>root</td> <td>Vị tr&iacute; ổ đĩa nơi chứa dữ liệu</td> </tr> <tr> <td>train</td> <td>Lấy tập dữ liệu huấn luyện</td> </tr> <tr> <td>download</td> <td>Tải xuống dữ liệu</td> </tr> <tr> <td>transform</td> <td>Một th&agrave;nh phần của c&aacute;c ph&eacute;p&nbsp;transformations sẽ được thực hiện tr&ecirc;n c&aacute;c phần tử của tập dữ liệu.</td> </tr> </tbody> </table> <p style="text-align: justify;">V&igrave; ch&uacute;ng ta muốn h&igrave;nh ảnh được chuyển đổi th&agrave;nh tensor n&ecirc;n ch&uacute;ng ta sử dụng <em>transforms.ToTensor()</em> c&oacute; sẵn v&agrave; v&igrave; tập dữ liệu n&agrave;y sẽ được sử dụng để đ&agrave;o tạo n&ecirc;n ch&uacute;ng ta sẽ đặt t&ecirc;n l&agrave; <em>train_set.</em></p> <h4 class="sub-section-heading" style="text-align: justify;">PyTorch DataLoader Class</h4> <p style="text-align: justify;">Để tạo một <em>DataLoader</em> cho tập huấn luyện ch&uacute;ng ta thực hiện như sau:</p> <pre class="language-python"><code>train_loader = torch.utils.data.DataLoader(train_set ,batch_size=1000 ,shuffle=True )</code></pre> <h3 style="text-align: justify;">Kết Luận</h3> <p style="text-align: justify;">Trong b&agrave;i đăng tiếp theo, ch&uacute;ng ta sẽ xem kỹ hơn c&aacute;ch ch&uacute;ng ta c&oacute; thể l&agrave;m việc với bộ dữ liệu v&agrave; bộ tải dữ liệu để truy cập v&agrave; xem c&aacute;c mẫu ri&ecirc;ng lẻ cũng như c&aacute;c batches.</p> <p style="text-align: justify;">Hẹn gặp lại bạn trong phần tiếp theo!</p> <p style="text-align: justify;">&nbsp;</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>