tek4

Giới Thiệu Tensors PyTorch – Lập Trình Neural Network Với Pytorch Bài 7

by - September. 21, 2021
Kiến thức
Machine Learning
Python
<p style="text-align: justify;"><em>Ch&agrave;o mừng c&aacute;c bạn đến với b&agrave;i viết thứ bảy trong loạt b&agrave;i về&nbsp;<a href="https://tek4.vn/lap-trinh-neural-network-voi-pytorch-deep-learning-voi-pytorch/" target="_blank" rel="noopener"><strong>Lập Tr&igrave;nh Neural Network Với Pytorch</strong></a>.&nbsp;Trong b&agrave;i viết n&agrave;y, ch&uacute;ng ta sẽ bắt đầu giới thiệu v&agrave; t&igrave;m hiểu s&acirc;u hơn về ch&iacute;nh PyTorch bằng c&aacute;ch kh&aacute;m ph&aacute; c&aacute;c Tensors của n&oacute;. Bắt đầu th&ocirc;i!</em></p> <h3 style="text-align: justify;">Giới Thiệu Tensors PyTorch</h3> <p style="text-align: justify;">C&aacute;c tensors PyTorch ch&iacute;nh l&agrave; cấu tr&uacute;c dữ liệu m&agrave; ch&uacute;ng ta sẽ sử dụng khi lập tr&igrave;nh mạng neural trong PyTorch.</p> <p style="text-align: justify;">Khi lập tr&igrave;nh mạng neural, tiền xử l&yacute; dữ liệu thường l&agrave; một trong những bước đầu ti&ecirc;n quan trọng nhất trong quy tr&igrave;nh tổng thể v&agrave; mục ti&ecirc;u của tiền xử l&yacute; dữ liệu l&agrave; chuyển đổi dữ liệu đầu v&agrave;o đang ở dạng th&ocirc; th&agrave;nh dạng tensor.</p> <h4 class="prettyprint prettyprinted" style="text-align: justify;"><span class="pln">Torch</span><span class="pun">.</span><span class="typ">Tensor</span></h4> <p style="text-align: justify;">Ch&uacute;ng ta c&oacute; thể tạo một đối tượng <em>torch.Tensor&nbsp;</em>như sau:</p> <pre class="language-python"><code>&gt; t = torch.Tensor() &gt; type(t) torch.Tensor</code></pre> <p style="text-align: justify;">Điều n&agrave;y tạo ra một tensor trống (tensor kh&ocirc;ng c&oacute; dữ liệu), nhưng ch&uacute;ng ta sẽ th&ecirc;m dữ liệu ngay sau đ&acirc;y.</p> <h4 style="text-align: justify;">Thuộc T&iacute;nh Của Tensor</h4> <p style="text-align: justify;">Đầu ti&ecirc;n, h&atilde;y xem x&eacute;t một v&agrave;i thuộc t&iacute;nh tensor.&nbsp;Mỗi <em>torch.Tensor</em> c&oacute; c&aacute;c thuộc t&iacute;nh sau:</p> <ul style="text-align: justify;"> <li>torch.dtype</li> <li>torch.device</li> <li>torch.layout</li> </ul> <p style="text-align: justify;">Nh&igrave;n v&agrave;o Tensor <em>t,</em> ch&uacute;ng ta c&oacute; thể thấy c&aacute;c gi&aacute; trị thuộc t&iacute;nh mặc định sau:</p> <pre class="language-python"><code>&gt; print(t.dtype) &gt; print(t.device) &gt; print(t.layout) torch.float32 cpu torch.strided</code></pre> <h5 class="sub-section-heading" style="text-align: justify;">torch.dtype</h5> <p style="text-align: justify;">Trong v&iacute; dụ tr&ecirc;n Dtype l&agrave;&nbsp;torch.float32&nbsp;chỉ định loại dữ liệu được chứa trong tensor.&nbsp;Tensors chứa dữ liệu số đồng nhất (c&ugrave;ng loại) với một trong c&aacute;c loại sau:</p> <table class=" aligncenter" style="height: 283px; width: 950px;" width="552"> <tbody> <tr> <td style="width: 265.25px;"><strong>Data type</strong></td> <td style="width: 210.25px;"><strong>dtype</strong></td> <td style="width: 230.25px;"><strong>CPU tensor</strong></td> <td style="width: 186.25px;"><strong>GPU tensor</strong></td> </tr> <tr> <td style="width: 265.25px;">32-bit floating point</td> <td style="width: 210.25px;">torch.float32</td> <td style="width: 230.25px;">torch.FloatTensor</td> <td style="width: 186.25px;">torch.cuda.FloatTensor</td> </tr> <tr> <td style="width: 265.25px;">64-bit floating point</td> <td style="width: 210.25px;">torch.float64</td> <td style="width: 230.25px;">torch.DoubleTensor</td> <td style="width: 186.25px;">torch.cuda.DoubleTensor</td> </tr> <tr> <td style="width: 265.25px;">16-bit floating point</td> <td style="width: 210.25px;">torch.float16</td> <td style="width: 230.25px;">torch.HalfTensor</td> <td style="width: 186.25px;">torch.cuda.HalfTensor</td> </tr> <tr> <td style="width: 265.25px;">8-bit integer (unsigned)</td> <td style="width: 210.25px;">torch.uint8</td> <td style="width: 230.25px;">torch.ByteTensor</td> <td style="width: 186.25px;">torch.cuda.ByteTensor</td> </tr> <tr> <td style="width: 265.25px;">8-bit integer (signed)</td> <td style="width: 210.25px;">torch.int8</td> <td style="width: 230.25px;">torch.CharTensor</td> <td style="width: 186.25px;">torch.cuda.CharTensor</td> </tr> <tr> <td style="width: 265.25px;">16-bit integer (signed)</td> <td style="width: 210.25px;">torch.int16</td> <td style="width: 230.25px;">torch.ShortTensor</td> <td style="width: 186.25px;">torch.cuda.ShortTensor</td> </tr> <tr> <td style="width: 265.25px;">32-bit integer (signed)</td> <td style="width: 210.25px;">torch.int32</td> <td style="width: 230.25px;">torch.IntTensor</td> <td style="width: 186.25px;">torch.cuda.IntTensor</td> </tr> <tr> <td style="width: 265.25px;">64-bit integer (signed)</td> <td style="width: 210.25px;">torch.int64</td> <td style="width: 230.25px;">torch.LongTensor</td> <td style="width: 186.25px;">torch.cuda.LongTensor</td> </tr> </tbody> </table> <p style="text-align: justify;">Mỗi loại đều c&oacute; phi&ecirc;n bản CPU v&agrave; GPU tương ứng.&nbsp;Một điều cần lưu &yacute; về kiểu dữ liệu tensor l&agrave; c&aacute;c ph&eacute;p to&aacute;n xảy ra giữa c&aacute;c tensor phải c&oacute; c&ugrave;ng kiểu dữ liệu.&nbsp;Tuy nhi&ecirc;n, điều n&agrave;y chỉ &aacute;p dụng cho c&aacute;c phi&ecirc;n bản PyTorch thấp hơn 1.3.</p> <p style="text-align: justify;">C&aacute;c ph&eacute;p to&aacute;n số học v&agrave; so s&aacute;nh, kể từ phi&ecirc;n bản PyTorch 1.3 trở l&ecirc;n, c&oacute; thể thực hiện được cho d&ugrave; ch&uacute;ng kh&ocirc;ng c&ugrave;ng kiểu dữ liệu.&nbsp;V&iacute; dụ dưới đ&acirc;y kh&ocirc;ng được ph&eacute;p trong phi&ecirc;n bản 1.2.&nbsp;Tuy nhi&ecirc;n, trong phi&ecirc;n bản 1.3 trở l&ecirc;n, kết quả trả về một tensor với dtype = torch.float32.</p> <pre class="language-python"><code>torch.tensor([1], dtype=torch.int) + torch.tensor([1], dtype=torch.float32)</code></pre> <p style="text-align: justify;">Bạn c&oacute; thể xem <a href="https://github.com/pytorch/pytorch/blob/master/docs/source/tensor_attributes.rst#type-promotion-doc" target="_blank" rel="noopener">t&agrave;i liệu đầy đủ</a> để biết th&ecirc;m chi tiết.</p> <h5 style="text-align: justify;">Torch.device</h5> <p style="text-align: justify;">Trong v&iacute; dụ tr&ecirc;n, device l&agrave; CPU tức l&agrave; chỉ định thiết bị (CPU hoặc GPU) nơi dữ liệu của Tensor được ph&acirc;n bổ.&nbsp;Điều n&agrave;y sẽ x&aacute;c định nơi t&iacute;nh to&aacute;n cho tensor.</p> <p style="text-align: justify;">PyTorch hỗ trợ việc sử dụng nhiều thiết bị v&agrave; ch&uacute;ng được chỉ định bằng c&aacute;ch sử dụng index như sau:</p> <pre class="language-python"><code>&gt; device = torch.device('cuda:0') &gt; device device(type='cuda', index=0)</code></pre> <p style="text-align: justify;">Một điều cần lưu &yacute; khi sử dụng nhiều thiết bị l&agrave; hoạt động giữa c&aacute;c tensor phải xảy ra giữa c&aacute;c tensor tồn tại tr&ecirc;n c&ugrave;ng một thiết bị.</p> <h5 style="text-align: justify;">Torch.layout</h5> <p style="text-align: justify;">Trong v&iacute; dụ tr&ecirc;n layout l&agrave; strided tức l&agrave;&nbsp;chỉ định c&aacute;ch tensor được lưu trong bộ nhớ. Bạn c&oacute; thể t&igrave;m hiểu th&ecirc;m&nbsp;stride <a href="https://en.wikipedia.org/wiki/Stride_of_an_array" target="_blank" rel="noopener">tại đ&acirc;y</a>.</p> <h4 style="text-align: justify;">Bỏ Qua C&aacute;c Thuộc T&iacute;nh Tensor</h4> <p style="text-align: justify;">L&agrave; một lập tr&igrave;nh vi&ecirc;n mạng Neural, ch&uacute;ng ta cần lưu &yacute; những điều sau:</p> <ol style="text-align: justify;"> <li>Dữ liệu của tensor phải thống nhất với nhau (dtype).</li> <li>Việc t&iacute;nh to&aacute;n giữa c&aacute;c tensor phụ thuộc v&agrave;o&nbsp;dtype&nbsp;v&agrave; device</li> </ol> <p style="text-align: justify;">B&acirc;y giờ ch&uacute;ng ta h&atilde;y xem c&aacute;c c&aacute;ch phổ biến để tạo ra tensors bằng dữ liệu trong PyTorch.</p> <h3 style="text-align: justify;">Tạo Tensor Bằng Dữ Liệu</h3> <p style="text-align: justify;">Đ&acirc;y l&agrave; những c&aacute;ch ch&iacute;nh để tạo c&aacute;c đối tượng tensor (c&aacute;c lớp thể hiện của torch.Tensor), với dữ liệu (giống mảng) trong PyTorch:</p> <ol style="text-align: justify;"> <li><code>torch.Tensor(data)</code></li> <li><code>torch.tensor(data)</code></li> <li><code>torch.as_tensor(data)</code></li> <li><code>torch.from_numpy(data)</code></li> </ol> <p style="text-align: justify;">Tất cả ch&uacute;ng đều chấp nhận một số dạng dữ liệu v&agrave; cung cấp cho ch&uacute;ng ta một thể hiện của lớp torch.Tensor.</p> <p style="text-align: justify;">Ch&uacute;ng ta sẽ bắt đầu bằng c&aacute;ch chỉ tạo một tensor với mỗi t&ugrave;y chọn v&agrave; xem những g&igrave; ch&uacute;ng ta nhận được. Bắt đầu bằng c&aacute;ch tạo một số dữ liệu.</p> <p style="text-align: justify;">Ta c&oacute; thể sử dụng một danh s&aacute;ch hoặc chuỗi Python, nhưng numpy.ndarrays l&agrave; t&ugrave;y chọn phổ biến hơn, v&igrave; vậy ch&uacute;ng ta sẽ sử dụng một numpy.ndarray như sau:</p> <pre class="language-python"><code>&gt; data = np.array([1,2,3]) &gt; type(data) numpy.ndarray</code></pre> <p style="text-align: justify;">Điều n&agrave;y cung cấp cho ch&uacute;ng ta một ch&uacute;t dữ liệu đơn giản với kiểu numpy.ndarray.</p> <p style="text-align: justify;">B&acirc;y giờ, h&atilde;y tạo c&aacute;c tensor của với mỗi t&ugrave;y chọn (1 - 4) v&agrave; xem những g&igrave; ch&uacute;ng ta nhận được:</p> <pre class="language-python"><code>&gt; o1 = torch.Tensor(data) &gt; o2 = torch.tensor(data) &gt; o3 = torch.as_tensor(data) &gt; o4 = torch.from_numpy(data) &gt; print(o1) &gt; print(o2) &gt; print(o3) &gt; print(o4) tensor([1., 2., 3.]) tensor([1, 2, 3], dtype=torch.int32) tensor([1, 2, 3], dtype=torch.int32) tensor([1, 2, 3], dtype=torch.int32)</code></pre> <p style="text-align: justify;">Tất cả c&aacute;c t&ugrave;y chọn (o1, o2, o3, o4) dường như tạo ra c&ugrave;ng một tensors ngoại trừ t&ugrave;y chọn đầu ti&ecirc;n.&nbsp;T&ugrave;y chọn đầu ti&ecirc;n (o1) c&oacute; c&aacute;c dấu chấm đằng sau mỗi số chỉ ra rằng c&aacute;c số đ&oacute; l&agrave; kiểu float, trong khi ba t&ugrave;y chọn tiếp theo c&oacute; kiểu int32.</p> <p style="text-align: justify;">Trong b&agrave;i tiếp theo, ch&uacute;ng ta sẽ xem s&eacute;t kỹ hơn về sự kh&aacute;c biệt n&agrave;y. B&acirc;y giờ, ch&uacute;ng ta h&atilde;y xem một số t&ugrave;y chọn c&oacute; sẵn để tạo tensors từ đầu m&agrave; kh&ocirc;ng cần c&oacute; bất kỳ dữ liệu n&agrave;o trước đ&oacute;.</p> <h3 style="text-align: justify;">C&aacute;c T&ugrave;y Chọn Tạo Tensor Kh&ocirc;ng Cần C&oacute; Dữ Liệu</h3> <p style="text-align: justify;">Dưới đ&acirc;y l&agrave; một số t&ugrave;y chọn c&oacute; sẵn.</p> <p style="text-align: justify;">Ch&uacute;ng ta c&oacute; h&agrave;m torch.eye() trả về một tensor 2-D với c&aacute;c gi&aacute; trị nằm tr&ecirc;n đường ch&eacute;o v&agrave; c&aacute;c số 0 nằm ở những vị tr&iacute; c&ograve;n lại.&nbsp;T&ecirc;n eye() được kết nối với &yacute; tưởng về&nbsp;<a href="https://en.wikipedia.org/wiki/Identity_matrix">identity matrix,</a>&nbsp;l&agrave; một ma trận vu&ocirc;ng với c&aacute;c gi&aacute; trị tr&ecirc;n đường ch&eacute;o ch&iacute;nh v&agrave; c&aacute;c số 0&nbsp;nằm ở những vị tr&iacute; c&ograve;n lại.</p> <pre class="language-python"><code>&gt; print(torch.eye(2)) tensor([ [1., 0.], [0., 1.] ])</code></pre> <p style="text-align: justify;">Ch&uacute;ng ta c&oacute; h&agrave;m torch.zeros() tạo ra một tensor ma trận 0:</p> <pre class="language-python"><code>&gt; print(torch.zeros([2,2])) tensor([ [0., 0.], [0., 0.] ])</code></pre> <p style="text-align: justify;">Tương tự như vậy, ch&uacute;ng ta c&oacute; h&agrave;m torch.ones () để tạo ra một tensor ma trận đơn vị:</p> <pre class="language-python"><code>&gt; print(torch.ones([2,2])) tensor([ [1., 1.], [1., 1.] ])</code></pre> <p style="text-align: justify;">Ch&uacute;ng ta cũng c&oacute; h&agrave;m torch.rand() tạo ra một tensor c&oacute; gi&aacute; trị l&agrave; ngẫu nhi&ecirc;n.</p> <pre class="language-python"><code>&gt; print(torch.rand([2,2])) tensor([ [0.0465, 0.4557], [0.6596, 0.0941] ])</code></pre> <p style="text-align: justify;">Tr&ecirc;n đ&acirc;y l&agrave; một v&agrave;i t&ugrave;y chọn để tạo tensor kh&ocirc;ng cần c&oacute; dữ liệu, bạn c&oacute; thể tham khảo&nbsp;&nbsp;<a href="https://pytorch.org/docs/stable/index.html">PyTorch documentation</a>&nbsp; để xem đầy đủ c&aacute;c t&ugrave;y chọn kh&aacute;c.</p> <h3 style="text-align: justify;">Kết Luận</h3> <p style="text-align: justify;">Hi vọng qua b&agrave;i viết n&agrave;y c&aacute;c bạn đ&atilde; hiểu r&otilde; c&aacute;ch m&agrave; ch&uacute;ng ta sử dụng pytorch để tạo ra c&aacute;c tensor từ sử dụng dữ liệu đến c&aacute;c t&ugrave;y chọn kh&ocirc;ng cần dữ liệu. Điều đ&oacute; sẽ thật đơn giản nếu sử dụng&nbsp;<em>numpy.ndarrays.</em></p> <p style="text-align: justify;">Trong b&agrave;i tiếp theo, ch&uacute;ng ta sẽ xem x&eacute;t s&acirc;u hơn một ch&uacute;t về c&aacute;c t&ugrave;y chọn tạo dữ liệu v&agrave; ch&uacute;ng ta sẽ kh&aacute;m ph&aacute; sự kh&aacute;c biệt giữa c&aacute;c t&ugrave;y chọn n&agrave;y cũng như xem t&ugrave;y chọn n&agrave;o hoạt động tốt nhất.</p> <p style="text-align: justify;">Hẹn gặp lại c&aacute;c bạn trong b&agrave;i viết tiếp theo!</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>