tek4

Xây Dựng Mạng Neural Trong PyTorch

by - September. 21, 2021
Kiến thức
Machine Learning
Python
<p style="text-align: justify;">Trong b&agrave;i đăng n&agrave;y, ch&uacute;ng ta sẽ bắt đầu x&acirc;y dựng m&ocirc; h&igrave;nh mạng neural t&iacute;ch chập (CNN) đầu ti&ecirc;n bằng c&aacute;ch sử dụng PyTorch. Bắt đầu th&ocirc;i!</p> <h3><img style="width: 627px; display: block; margin-left: auto; margin-right: auto;" src="http://tek4vn.2soft.top/public_files/xay-dung-mang-neural-trong-pytorch-png-1" alt="X&acirc;y Dựng Mạng Neural Trong PyTorch" height="327" /></h3> <h3 class="sub-section-heading" style="text-align: justify;">Điều Kiện Ti&ecirc;n Quyết</h3> <p style="text-align: justify;">Để x&acirc;y dựng mạng neural trong PyTorch, ch&uacute;ng ta cần mở rộng lớp PyTorch <em>torch.nn.Module.&nbsp;</em>Điều n&agrave;y c&oacute; nghĩa l&agrave; ch&uacute;ng ta cần sử dụng một ch&uacute;t lập tr&igrave;nh hướng đối tượng (OOP) trong Python.</p> <p style="text-align: justify;">Ch&uacute;ng ta sẽ thực hiện đ&aacute;nh gi&aacute; nhanh về OOP trong b&agrave;i viết n&agrave;y để đề cập đến c&aacute;c chi tiết cần thiết để l&agrave;m việc với mạng neural PyTorch, nhưng nếu bạn thấy rằng bạn cần nhiều hơn thế, t&agrave;i liệu Python c&oacute; hướng dẫn tổng quan <a href="https://docs.python.org/3/tutorial/classes.html" target="_blank" rel="noopener">tại đ&acirc;y</a>.</p> <p style="text-align: justify;">Để x&acirc;y dựng một mạng neural t&iacute;ch chập, ch&uacute;ng ta cần c&oacute; hiểu biết chung về c&aacute;ch thức hoạt động của CNN v&agrave; những th&agrave;nh phần n&agrave;o được sử dụng để x&acirc;y dựng CNN.</p> <p style="text-align: justify;">B&acirc;y giờ h&atilde;y bắt đầu với b&agrave;i đ&aacute;nh gi&aacute; nhanh về lập tr&igrave;nh hướng đối tượng.</p> <h4 class="sub-section-heading" style="text-align: justify;">Đ&aacute;nh gi&aacute; nhanh về lập tr&igrave;nh hướng đối tượng</h4> <p style="text-align: justify;">Khi ch&uacute;ng ta viết chương tr&igrave;nh hoặc x&acirc;y dựng phần mềm, c&oacute; hai th&agrave;nh phần ch&iacute;nh l&agrave; code v&agrave; dữ liệu.&nbsp;Với lập tr&igrave;nh hướng đối tượng, ch&uacute;ng ta định hướng thiết kế v&agrave; cấu tr&uacute;c chương tr&igrave;nh của ch&uacute;ng ta xung quanh c&aacute;c đối tượng.</p> <p style="text-align: justify;">C&aacute;c đối tượng (<em>Objects</em>) được định nghĩa trong code bằng c&aacute;ch sử dụng c&aacute;c lớp <em>(classes).</em> Một lớp x&aacute;c định đặc điểm kỹ thuật hoặc th&ocirc;ng số kỹ thuật của đối tượng, n&oacute; chỉ định dữ liệu v&agrave; code m&agrave; mỗi đối tượng của lớp phải c&oacute;.</p> <p style="text-align: justify;">Khi ch&uacute;ng ta tạo một đối tượng của một lớp, ch&uacute;ng ta gọi đối tượng l&agrave; <em>một thể hiện của lớp (&nbsp;instance of the class)</em> v&agrave; tất cả c&aacute;c thể hiện của một lớp nhất định c&oacute; hai th&agrave;nh phần cốt l&otilde;i:</p> <ul style="text-align: justify;"> <li><em>Methods</em>&nbsp;(code) - Phương thức</li> <li><em>Attributes</em>&nbsp;(data) - Thuộc t&iacute;nh</li> </ul> <p style="text-align: justify;">C&aacute;c phương thức đại diện cho code, trong khi c&aacute;c thuộc t&iacute;nh đại diện cho dữ liệu, v&agrave; do đ&oacute;, c&aacute;c phương thức v&agrave; thuộc t&iacute;nh được định nghĩa bởi lớp.</p> <p style="text-align: justify;">Trong một chương tr&igrave;nh, nhiều đối tượng c&oacute; thể tồn tại đồng thời v&agrave; sẽ c&oacute; c&ugrave;ng c&aacute;c thuộc t&iacute;nh, c&ugrave;ng c&aacute;c phương thức giống nhau.</p> <p style="text-align: justify;">Sự kh&aacute;c biệt giữa c&aacute;c đối tượng của c&ugrave;ng một lớp l&agrave; c&aacute;c gi&aacute; trị chứa b&ecirc;n trong đối tượng cho mỗi thuộc t&iacute;nh.&nbsp;Mỗi đối tượng c&oacute; c&aacute;c gi&aacute; trị thuộc t&iacute;nh ri&ecirc;ng.&nbsp;C&aacute;c gi&aacute; trị n&agrave;y x&aacute;c định trạng th&aacute;i b&ecirc;n trong của đối tượng. Code&nbsp;v&agrave; dữ liệu của mỗi đối tượng được cho l&agrave; được đ&oacute;ng g&oacute;i trong đối tượng.</p> <p style="text-align: justify;">V&iacute; dụ:&nbsp;H&atilde;y x&acirc;y dựng một lớp &nbsp;lizard đơn giản để chứng minh c&aacute;ch c&aacute;c lớp đ&oacute;ng g&oacute;i dữ liệu v&agrave; code:</p> <pre class="language-python"><code>class Lizard: #class declaration def __init__(self, name): #class constructor (code) self.name = name #attribute (data) def set_name(self, name): #method declaration (code) self.name = name #method implementation (code)</code></pre> <p style="text-align: justify;">D&ograve;ng đầu ti&ecirc;n khai b&aacute;o lớp v&agrave; chỉ định t&ecirc;n lớp, trong trường hợp n&agrave;y l&agrave; Lizard.</p> <p style="text-align: justify;">D&ograve;ng thứ hai định nghĩa một phương thức đặc biệt được gọi l&agrave; phương thức tạo lớp.&nbsp;C&aacute;c h&agrave;m tạo lớp được gọi khi một thể hiện mới của lớp được tạo.&nbsp;Như c&aacute;c tham số, ch&uacute;ng ta c&oacute;&nbsp;<em>self</em> v&agrave; <em>name.&nbsp;</em></p> <p style="text-align: justify;">Tham số self cho ch&uacute;ng ta khả năng tạo c&aacute;c gi&aacute; trị thuộc t&iacute;nh được lưu trữ hoặc đ&oacute;ng g&oacute;i trong đối tượng.&nbsp;Khi ch&uacute;ng ta gọi h&agrave;m tạo n&agrave;y hoặc bất kỳ phương thức n&agrave;o kh&aacute;c, ch&uacute;ng ta kh&ocirc;ng truyền tham số self.&nbsp;Python tự động l&agrave;m điều n&agrave;y cho ch&uacute;ng ta.</p> <p style="text-align: justify;">C&aacute;c gi&aacute; trị đối số cho bất kỳ tham số n&agrave;o kh&aacute;c được truyền t&ugrave;y &yacute; bởi tr&igrave;nh gọi v&agrave; c&aacute;c gi&aacute; trị được truyền n&agrave;y đi k&egrave;m với phương thức c&oacute; thể được sử dụng trong một ph&eacute;p t&iacute;nh hoặc được lưu v&agrave; truy cập sau n&agrave;y bằng c&aacute;ch sử dụng <em>self.&nbsp;</em></p> <p style="text-align: justify;">Sau khi ho&agrave;n th&agrave;nh với h&agrave;m tạo, ch&uacute;ng ta c&oacute; thể tạo bất kỳ phương thức chuy&ecirc;n biệt n&agrave;o như phương thức n&agrave;y v&iacute; dụ tr&ecirc;n cho ph&eacute;p người gọi thay đổi gi&aacute; trị t&ecirc;n đ&atilde; được lưu trữ trong <em>self.&nbsp;</em>Tất cả những g&igrave; ch&uacute;ng ta phải l&agrave;m ở đ&acirc;y l&agrave; gọi phương thức v&agrave; chuyển một gi&aacute; trị mới cho <em>name.</em></p> <pre class="language-python"><code>&gt; lizard = Lizard('deep') &gt; print(lizard.name) deep &gt; lizard.set_name('lizard') &gt; print(lizard.name) lizard</code></pre> <p style="text-align: justify;">Ch&uacute;ng ta tạo một thể hiện (instance) đối tượng của lớp bằng c&aacute;ch chỉ định t&ecirc;n lớp v&agrave; truyền c&aacute;c đối số của h&agrave;m tạo.&nbsp;H&agrave;m tạo sẽ nhận c&aacute;c đối số n&agrave;y v&agrave; code khởi tạo sẽ chạy lưu t&ecirc;n được truyền v&agrave;o.</p> <p style="text-align: justify;">Sau đ&oacute;, ch&uacute;ng ta c&oacute; thể truy cập v&agrave;o name v&agrave; in n&oacute; ra m&agrave;n h&igrave;nh, đồng thời gọi phương thức <em>set_name()</em> để thay đổi name.</p> <h3 class="section-heading" style="text-align: justify;">G&oacute;i&nbsp;<em>torch.nn </em>của PyTorch</h3> <p style="text-align: justify;">Để x&acirc;y dựng mạng neural trong PyTorch, ch&uacute;ng ta sử dụng g&oacute;i <em>torch.nn,</em> l&agrave; thư viện neural network (nn) của PyTorch. Ta import g&oacute;i như sau:</p> <pre class="language-python"><code>import torch.nn as nn</code></pre> <p style="text-align: justify;">Thư viện mạng neural của PyTorch chứa tất cả c&aacute;c th&agrave;nh phần điển h&igrave;nh cần thiết để x&acirc;y dựng mạng neural.</p> <p style="text-align: justify;">Th&agrave;nh phần ch&iacute;nh m&agrave; ch&uacute;ng ta cần để x&acirc;y dựng mạng neural l&agrave; một layer v&agrave; v&igrave; vậy, như ch&uacute;ng ta c&oacute; thể mong đợi, thư viện mạng neural của PyTorch chứa c&aacute;c classes hỗ trợ ch&uacute;ng ta trong việc x&acirc;y dựng c&aacute;c layer.</p> <h4 class="sub-section-heading" style="text-align: justify;">Lớp <em>nn.Module</em> Của PyTorch</h4> <p style="text-align: justify;">Như ch&uacute;ng ta đ&atilde; biết, mạng deep neural được x&acirc;y dựng bằng nhiều layers.&nbsp;Đ&acirc;y l&agrave; điều l&agrave;m cho mạng trở n&ecirc;n deep, mỗi layers trong mạng neural c&oacute; hai th&agrave;nh phần ch&iacute;nh:</p> <ul style="text-align: justify;"> <li>A transformation (code)</li> <li>A collection of weights (data)</li> </ul> <p style="text-align: justify;">Trong g&oacute;i <em>nn,</em> c&oacute; một lớp gọi l&agrave; <em>Module,</em> v&agrave; n&oacute; l&agrave; lớp cơ sở cho tất cả c&aacute;c m&ocirc;-đun mạng neural bao gồm c&aacute;c layers.</p> <p style="text-align: justify;">Điều n&agrave;y c&oacute; nghĩa l&agrave; tất cả c&aacute;c lớp trong PyTorch, mở rộng lớp <em>nn.Module</em> v&agrave; kế thừa tất cả chức năng t&iacute;ch hợp của PyTorch trong lớp <em>nn.Module.</em></p> <p style="text-align: justify;">Ngay cả c&aacute;c mạng neural cũng mở rộng lớp <em>nn.Module.&nbsp;</em>Điều n&agrave;y c&oacute; &yacute; nghĩa v&igrave; bản th&acirc;n mạng neural c&oacute; thể được coi l&agrave; một lớp lớn.</p> <p style="text-align: justify;">C&aacute;c lớp v&agrave; mạng neural trong PyTorch mở rộng lớp <em>nn.Module.</em>&nbsp;Điều n&agrave;y c&oacute; nghĩa l&agrave; ch&uacute;ng ta phải mở rộng lớp <em>nn.Module</em> khi x&acirc;y dựng một lớp hoặc mạng neural mới trong PyTorch.</p> <h4 class="sub-section-heading" style="text-align: justify;">PyTorch <em>nn.Modules</em>&nbsp;c&oacute; phương thức <em>Forward()</em></h4> <p style="text-align: justify;">Khi ch&uacute;ng ta truyền một tensor v&agrave;o mạng để l&agrave;m đầu v&agrave;o, tensor sẽ chuyển qua c&aacute;c layers cho đến khi tensor đến layer đầu ra. Qu&aacute; tr&igrave;nh n&agrave;y của tensor được gọi l&agrave; chuyển tiếp.</p> <pre><code>The tensor input is passed forward though the network.</code></pre> <p style="text-align: justify;">Đầu v&agrave;o tensor được chuyển tiếp qua mạng.</p> <p style="text-align: justify;">Mỗi layers c&oacute; sự chuyển đổi (code) ri&ecirc;ng v&agrave; tensor chuyển tiếp qua mỗi layers. Th&agrave;nh phần của tất cả c&aacute;c layer ri&ecirc;ng lẻ được chuyển tiếp cho mạng tổng thể.</p> <p style="text-align: justify;">Mục ti&ecirc;u của chuyển đổi tổng thể l&agrave; chuyển đổi hoặc &aacute;nh xạ đầu v&agrave;o th&agrave;nh lớp đầu ra để dự đo&aacute;n ch&iacute;nh x&aacute;c v&agrave; trong qu&aacute; tr&igrave;nh đ&agrave;o tạo, trọng số layer (dữ liệu) được cập nhật theo c&aacute;ch khiến &aacute;nh xạ điều chỉnh để l&agrave;m cho đầu ra gần với dự đo&aacute;n ch&iacute;nh x&aacute;c hơn.</p> <p style="text-align: justify;">Tất cả điều n&agrave;y c&oacute; nghĩa l&agrave;, mọi <em>nn.Module</em> đều c&oacute; phương thức <em>forward()</em> v&agrave; v&igrave; vậy khi ch&uacute;ng ta x&acirc;y dựng c&aacute;c layers v&agrave; mạng, ch&uacute;ng ta phải cung cấp một triển khai của phương thức <em>forward().</em></p> <h4 class="sub-section-heading" style="text-align: justify;">G&oacute;i <em>nn.functional</em> của PyTorch</h4> <p style="text-align: justify;">Khi ch&uacute;ng ta triển khai phương thức <em>forward()</em> của lớp nn.Module, ch&uacute;ng ta thường sẽ sử dụng c&aacute;c h&agrave;m từ g&oacute;i <em>nn.functional.&nbsp;</em>G&oacute;i n&agrave;y cung cấp cho ch&uacute;ng ta nhiều hoạt động mạng neural m&agrave; ch&uacute;ng ta c&oacute; thể sử dụng để x&acirc;y dựng c&aacute;c layers.&nbsp;Tr&ecirc;n thực tế, nhiều lớp lớp <em>nn.Module</em> sử dụng c&aacute;c h&agrave;m <em>nn.functional</em> để thực hiện c&aacute;c hoạt động của ch&uacute;ng.</p> <p style="text-align: justify;">G&oacute;i <em>nn.functional</em>&nbsp;chứa c&aacute;c phương thức m&agrave; c&aacute;c lớp con của <em>nn.Module</em> sử dụng để triển khai c&aacute;c h&agrave;m <em>forward()</em> của ch&uacute;ng.&nbsp;Sau đ&acirc;y, ch&uacute;ng ta xem một v&iacute; dụ về điều n&agrave;y bằng c&aacute;ch xem m&atilde; nguồn PyTorch của lớp&nbsp;convolutional layer <em>nn.Conv2d.</em></p> <h3 class="section-heading" style="text-align: justify;">X&acirc;y dựng mạng neural trong PyTorch</h3> <p style="text-align: justify;">B&acirc;y giờ ch&uacute;ng ta đ&atilde; c&oacute; đủ th&ocirc;ng tin để cung cấp ph&aacute;c thảo cho việc x&acirc;y dựng mạng neural trong PyTorch.&nbsp;C&aacute;c bước thực hiện như sau:</p> <p style="text-align: justify;"><em>Phi&ecirc;n bản t&oacute;m tắt:</em></p> <ol style="text-align: justify;"> <li>Mở rộng lớp&nbsp;<em>nn.Module</em> cơ sở.</li> <li>X&aacute;c định c&aacute;c layers dưới dạng c&aacute;c thuộc t&iacute;nh của lớp.</li> <li>Triển khai phương thức <em>forward().</em></li> </ol> <p style="text-align: justify;"><em>Phi&ecirc;n bản chi tiết hơn:</em></p> <ol style="text-align: justify;"> <li>Tạo một lớp mạng neural mở rộng lớp cơ sở <em>nn.Module.</em></li> <li>Trong phương thức tạo lớp, h&atilde;y x&aacute;c định c&aacute;c layers của mạng l&agrave;m thuộc t&iacute;nh lớp bằng c&aacute;ch sử dụng c&aacute;c layers được tạo sẵn từ <em>torch.nn.</em></li> <li>Sử dụng c&aacute;c thuộc t&iacute;nh layer của mạng cũng như c&aacute;c hoạt động từ API <em>nn.functional</em> để x&aacute;c định chuyển tiếp của mạng.</li> </ol> <h4 class="sub-section-heading" style="text-align: justify;">Mở rộng lớp <em>nn.Module</em>&nbsp;của PyTorch</h4> <p style="text-align: justify;">Giống như ch&uacute;ng ta đ&atilde; l&agrave;m với v&iacute; dụ về lớp Lizard, h&atilde;y tạo một lớp đơn giản để đại diện cho mạng neural.</p> <pre class="language-python"><code>class Network: def __init__(self): self.layer = None def forward(self, t): t = self.layer(t) return t</code></pre> <p style="text-align: justify;">Điều n&agrave;y cho ch&uacute;ng ta một lớp mạng đơn giản c&oacute; một lớp giả (dummy) duy nhất b&ecirc;n trong phương thức khởi tạo v&agrave; một triển khai giả cho h&agrave;m forward.</p> <p style="text-align: justify;">Đ&acirc;y l&agrave; một khởi đầu tốt, nhưng lớp n&agrave;y vẫn chưa mở rộng lớp <em>nn.Module.&nbsp;</em>Để l&agrave;m cho lớp <em>Network</em> của ch&uacute;ng ta mở rộng <em>nn.Module,</em> ch&uacute;ng ta phải thực hiện hai việc bổ sung:</p> <ol style="text-align: justify;"> <li>Chỉ định lớp <em>nn.Module</em> trong dấu ngoặc đơn tr&ecirc;n d&ograve;ng 1.</li> <li>Ch&egrave;n một lời gọi đến h&agrave;m, lớp super tr&ecirc;n d&ograve;ng 3 b&ecirc;n trong h&agrave;m tạo.</li> </ol> <p style="text-align: justify;">Như sau:</p> <pre class="language-python"><code>class Network(nn.Module): # line 1 def __init__(self): super().__init__() # line 3 self.layer = None def forward(self, t): t = self.layer(t) return t</code></pre> <p style="text-align: justify;">Những thay đổi n&agrave;y biến đổi mạng neural đơn giản của ch&uacute;ng ta th&agrave;nh mạng neural PyTorch bởi v&igrave; ch&uacute;ng ta hiện đang mở rộng lớp cơ sở <em>nn.Module</em> của PyTorch.</p> <p style="text-align: justify;">Với điều n&agrave;y, ch&uacute;ng t&ocirc;i đ&atilde; ho&agrave;n th&agrave;nh!&nbsp;B&acirc;y giờ ch&uacute;ng ta c&oacute; một lớp <em>Network</em> c&oacute; tất cả c&aacute;c chức năng của lớp PyTorch <em>nn.Module.</em></p> <h4 class="sub-section-heading" style="text-align: justify;">X&aacute;c định c&aacute;c Layers của mạng dưới dạng thuộc t&iacute;nh lớp</h4> <p style="text-align: justify;">Hiện tại, lớp <em>Network</em> của ch&uacute;ng ta c&oacute; một layer giả (dummy) duy nhất l&agrave;m thuộc t&iacute;nh.&nbsp;B&acirc;y giờ h&atilde;y thay thế layer n&agrave;y bằng một số layers thực được tạo sẵn cho ch&uacute;ng ta từ thư viện <em>nn</em> của PyTorch. Ch&uacute;ng ta đang x&acirc;y dựng CNN, v&igrave; vậy hai loại layers m&agrave; ch&uacute;ng ta sẽ sử dụng l&agrave; layer tuyến t&iacute;nh (linear) v&agrave; layer t&iacute;ch chập (convolutional).</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;">Tại thời điểm n&agrave;y, ch&uacute;ng ta c&oacute; một lớp Python được gọi l&agrave; Network mở rộng lớp&nbsp;<em>nn.Module&nbsp;</em>của&nbsp;PyTorch.&nbsp;B&ecirc;n trong lớp Network của ch&uacute;ng ta, ch&uacute;ng ta c&oacute; năm layers được định nghĩa l&agrave; thuộc t&iacute;nh.&nbsp;trong đ&oacute;, c&oacute; hai layers chập, self.conv1 v&agrave; self.conv2, v&agrave; ba layers tuyến t&iacute;nh, self.fc1, self.fc2, self.out.</p> <p style="text-align: justify;">Ch&uacute;ng ta đ&atilde; sử dụng từ viết tắt fc trong fc1 v&agrave; fc2 v&igrave; c&aacute;c layers tuyến t&iacute;nh c&ograve;n được gọi l&agrave; c&aacute;c&nbsp;<em>fully connected layers.&nbsp;</em><em>Ch&uacute;ng cũng c&oacute; một c&aacute;i t&ecirc;n thứ ba m&agrave; đ&ocirc;i khi ch&uacute;ng ta c&oacute; thể nghe gọi l&agrave;&nbsp;dense.&nbsp;</em>V&igrave; vậy, linear, dense v&agrave; fully connected l&agrave; tất cả c&aacute;c c&aacute;ch để chỉ c&ugrave;ng một loại layer.&nbsp;PyTorch sử dụng từ <em>linear,</em> do đ&oacute; c&oacute; t&ecirc;n lớp <em>nn.Linear.</em></p> <p style="text-align: justify;">Ch&uacute;ng ta đ&atilde; sử dụng t&ecirc;n <em>out</em> cho layer tuyến t&iacute;nh cuối c&ugrave;ng v&igrave; layer cuối c&ugrave;ng trong mạng l&agrave; lớp đầu ra.</p> <h3 style="text-align: justify;">Kết Luận</h3> <p style="text-align: justify;">B&acirc;y giờ ch&uacute;ng ta c&oacute; một &yacute; tưởng hay về c&aacute;ch bắt đầu x&acirc;y dựng mạng neural trong PyTorch bằng c&aacute;ch sử dụng thư viện <em>torch.nn.</em>&nbsp;Trong b&agrave;i đăng tiếp theo, ch&uacute;ng ta sẽ điều tra c&aacute;c loại th&ocirc;ng số kh&aacute;c nhau của c&aacute;c layers v&agrave; hiểu c&aacute;ch ch&uacute;ng được chọn.</p> <p style="text-align: justify;">Hẹn gặp lại c&aacute;c bạn trong phần tiếp theo!</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>