tek4

Mạng Neural: Giới Thiệu Và Ví Dụ – Tự Học TensorFlow

by - September. 21, 2021
Kiến thức
<p style="text-align: justify;">Ch&agrave;o mừng c&aacute;c bạn quay trở lại với loạt b&agrave;i&nbsp;<a href="../../tu-hoc-tensorflow-deep-learning-cho-nguoi-moi-bat-dau/" target="_blank" rel="noopener">Tự Học Tensorflow</a>&nbsp;của&nbsp;<a href="../../" target="_blank" rel="noopener">tek4.vn</a>. B&agrave;i viết n&agrave;y sẽ giới thiệu đến c&aacute;c bạn về mạng neural v&agrave; v&iacute; dụ minh họa bằng Tensorflow. Bắt đầu th&ocirc;i!</p> <p style="text-align: justify;">Xem th&ecirc;m b&agrave;i viết trước:&nbsp;<a href="../../kernel-methods-trong-machine-learning-tu-hoc-tensorflow/" target="_blank" rel="noopener">Kernel Methods trong Machine learning</a></p> <h3 id="ftoc-heading-1" class="ftwp-heading" style="text-align: justify;">Artificial Neural Network l&agrave; g&igrave;</h3> <p style="text-align: justify;">Artificial Neural Network(ANN) &ndash; Mạng thần kinh nh&acirc;n tạo bao gồm bốn đối tượng ch&iacute;nh:</p> <ul style="text-align: justify;"> <li>Layers: &nbsp;Tất cả việc học diễn ra trong c&aacute;c layers. C&oacute; 3 loại layers l&agrave; input layer, hidden layer v&agrave; output layer.</li> <li>Đặc trưng v&agrave; nh&atilde;n: Dữ liệu đầu v&agrave;o (đặc trưng) v&agrave; đầu ra từ mạng (nh&atilde;n hoặc gi&aacute; trị thực như x&aacute;c suất rơi v&agrave;o c&aacute;c nh&atilde;n).</li> <li>H&agrave;m mất m&aacute;t: H&agrave;m số được sử dụng để ước t&iacute;nh hiệu suất của giai đoạn học tập.</li> <li>Tối ưu h&oacute;a: Cải thiện việc học bằng c&aacute;ch cập nhật trọng số trong mạng.</li> </ul> <p style="text-align: justify;">Một mạng neural sẽ lấy dữ liệu đầu v&agrave;o sau đ&oacute; đưa c&aacute;c dữ liệu n&agrave;y đi qua c&aacute;c layers. Mạng cần đ&aacute;nh gi&aacute; hiệu suất của n&oacute; với một h&agrave;m mất m&aacute;t ( loss function). H&agrave;m mất m&aacute;t đ&oacute;ng vai cho như một thang đo về hiệu quả của m&ocirc; h&igrave;nh hay mạng đ&agrave;o tạo. Để c&oacute; thể giảm thiểu gi&aacute; trị h&agrave;m loss mạng sẽ sử dụng tr&igrave;nh tối ưu h&oacute;a, tại đ&acirc;y một số thuật to&aacute;n tối ưu hay được sử dụng như SGD, Adam ...</p> <p style="text-align: justify;">Nếu bạn nh&igrave;n v&agrave;o h&igrave;nh b&ecirc;n dưới, bạn sẽ hiểu cơ chế hoạt động.</p> <p><img class="aligncenter size-full wp-image-7468 disappear appear" style="display: block; margin-left: auto; margin-right: auto;" src="../../wp-content/uploads/2021/01/083018_0539_NeuralNetwo1.png" sizes="(max-width: 578px) 100vw, 578px" srcset="https://old.tek4.vn/wp-content/uploads/2021/01/083018_0539_NeuralNetwo1.png 578w, https://old.tek4.vn/wp-content/uploads/2021/01/083018_0539_NeuralNetwo1-282x300.png 282w" alt="" width="536" height="569" loading="lazy" /></p> <p style="text-align: justify;">Chương tr&igrave;nh nhận một số gi&aacute; trị input v&agrave; đẩy ch&uacute;ng v&agrave;o hai layers được kết nối đầy đủ (fully connected layers). Lần đầu ti&ecirc;n mạng xem dữ liệu v&agrave; đưa ra dự đo&aacute;n, n&oacute; sẽ kh&ocirc;ng khớp ho&agrave;n to&agrave;n với dữ liệu thực tế.</p> <p style="text-align: justify;">Để n&acirc;ng cao kiến ​​thức, mạng sử dụng tr&igrave;nh tối ưu h&oacute;a (optimizer) để cập nhật lại kiến thức (ch&iacute;nh l&agrave; bộ trọng số trong mạng) sao cho tối thiểu h&agrave;m mất m&aacute;t. Chương tr&igrave;nh sẽ lặp lại bước n&agrave;y cho đến khi lỗi thấp nhất c&oacute; thể.</p> <h3 id="ftoc-heading-2" class="ftwp-heading" style="text-align: justify;">Kiến tr&uacute;c của mạng neural</h3> <h4 id="ftoc-heading-3" class="ftwp-heading" style="text-align: justify;">Layers</h4> <p style="text-align: justify;">Layer l&agrave; nơi diễn ra tất cả qu&aacute; tr&igrave;nh học. B&ecirc;n trong một layer, c&oacute; v&ocirc; số trọng số (neurons &ndash; tế b&agrave;o thần kinh). Một mạng neural điển h&igrave;nh thường được xử l&yacute; bởi c&aacute;c layers kết nối d&agrave;y đặc (c&ograve;n được gọi l&agrave; c&aacute;c layers kết nối đầy đủ). N&oacute; c&oacute; nghĩa l&agrave; tất cả c&aacute;c neuron trong layer trước sẽ được kết nối với tất cả c&aacute;c neuron trong layer sau.</p> <p style="text-align: justify;">Một mạng neural điển h&igrave;nh nhận một vectơ đầu v&agrave;o v&agrave; một đại lượng v&ocirc; hướng chứa c&aacute;c nh&atilde;n. C&aacute;ch thiết lập đơn giản nhất l&agrave; ph&acirc;n loại nhị ph&acirc;n chỉ c&oacute; hai lớp: 0 v&agrave; 1.</p> <p style="text-align: justify;">Mạng nhận đầu v&agrave;o, gửi đến tất cả c&aacute;c nodes được kết nối v&agrave; t&iacute;nh to&aacute;n với h&agrave;m k&iacute;ch hoạt (activation function).</p> <p><img class="aligncenter size-full wp-image-7469 disappear appear" style="display: block; margin-left: auto; margin-right: auto;" src="../../wp-content/uploads/2021/01/nnw.png" sizes="(max-width: 772px) 100vw, 772px" srcset="https://old.tek4.vn/wp-content/uploads/2021/01/nnw.png 772w, https://old.tek4.vn/wp-content/uploads/2021/01/nnw-300x257.png 300w, https://old.tek4.vn/wp-content/uploads/2021/01/nnw-768x659.png 768w" alt="" width="515" height="441" loading="lazy" /></p> <p style="text-align: justify;">H&igrave;nh tr&ecirc;n thể hiện &yacute; tưởng n&agrave;y. Layer đầu ti&ecirc;n l&agrave; c&aacute;c gi&aacute; trị đầu v&agrave;o cho layer thứ hai, được gọi l&agrave; layer ẩn, nhận đầu v&agrave;o c&oacute; trọng số từ layer trước.</p> <ol style="text-align: justify;"> <li>Node đầu ti&ecirc;n l&agrave; c&aacute;c gi&aacute; trị đầu v&agrave;o</li> <li>Neuron được ph&acirc;n r&atilde; th&agrave;nh phần đầu v&agrave;o v&agrave; h&agrave;m k&iacute;ch hoạt. Phần b&ecirc;n tr&aacute;i nhận tất cả dữ liệu đầu v&agrave;o từ layer trước. Phần b&ecirc;n phải l&agrave; tổng của đầu v&agrave;o chuyển v&agrave;o một h&agrave;m k&iacute;ch hoạt.</li> <li>Gi&aacute; trị đầu ra được t&iacute;nh to&aacute;n từ c&aacute;c layer ẩn v&agrave; được sử dụng để đưa ra dự đo&aacute;n. Đối với ph&acirc;n loại, n&oacute; bằng với số lớp. Đối với hồi quy, chỉ một gi&aacute; trị được dự đo&aacute;n.</li> </ol> <h4 id="ftoc-heading-4" class="ftwp-heading" style="text-align: justify;"><strong>Activation function &ndash; H&agrave;m k&iacute;ch hoạt</strong></h4> <p style="text-align: justify;">H&agrave;m k&iacute;ch hoạt của một node x&aacute;c định đầu ra cho một tập hợp c&aacute;c đầu v&agrave;o. Ta cần một h&agrave;m k&iacute;ch hoạt để cho ph&eacute;p mạng t&igrave;m hiểu m&ocirc; h&igrave;nh phi tuyến t&iacute;nh. Một h&agrave;m k&iacute;ch hoạt phổ biến l&agrave; <strong>Relu &ndash; Rectified linear unit</strong>, đặc điểm của h&agrave;m n&agrave;y l&agrave; sẽ c&oacute; đầu ra l&agrave; 0 khi đầu v&agrave;o mang gi&aacute; trị &acirc;m nếu đầu v&agrave;o l&agrave; gi&aacute; trị dương th&igrave; khi đi qua h&agrave;m n&agrave;y sẽ vẫn giữ nguy&ecirc;n được gi&aacute; trị.</p> <p><img class="aligncenter disappear appear" style="display: block; margin-left: auto; margin-right: auto;" src="https://www.guru99.com/images/tensorflow/083018_0539_NeuralNetwo3.png" /></p> <p style="text-align: justify;">C&ograve;n một số h&agrave;m k&iacute;ch hoạt kh&aacute;c như:</p> <ul style="text-align: justify;"> <li>Piecewise Linear</li> <li>Sigmoid</li> <li>Tanh</li> <li>Leaky Relu</li> </ul> <p style="text-align: justify;">Quyết định quan trọng cần thực hiện khi x&acirc;y dựng mạng neural l&agrave;:</p> <ul style="text-align: justify;"> <li>C&oacute; bao nhi&ecirc;u layer trong mạng neural</li> <li>C&oacute; bao nhi&ecirc;u đơn vị ẩn (neuron) cho mỗi layer&nbsp;</li> </ul> <p style="text-align: justify;">Mạng neural với nhiều layers v&agrave; c&aacute;c đơn vị ẩn c&oacute; thể học c&aacute;ch biểu diễn dữ liệu phức tạp, nhưng n&oacute; l&agrave;m cho việc t&iacute;nh to&aacute;n của mạng trở n&ecirc;n rất tốn k&eacute;m v&agrave; mất thời gian.</p> <h4 id="ftoc-heading-5" class="ftwp-heading" style="text-align: justify;">Loss function &ndash; H&agrave;m mất m&aacute;t</h4> <p style="text-align: justify;">Sau khi đ&atilde; x&aacute;c định c&aacute;c layers ẩn v&agrave; h&agrave;m k&iacute;ch hoạt, ch&uacute;ng ta cần chỉ định loss function v&agrave; optimizer.</p> <p style="text-align: justify;">Đối với ph&acirc;n loại nhị ph&acirc;n, th&ocirc;ng thường sử dụng h&agrave;m mất m&aacute;t l&agrave; binary cross entropy. Trong hồi quy tuyến t&iacute;nh th&igrave; mean square error sẽ được sử dụng.</p> <p style="text-align: justify;">Gi&aacute; trị của h&agrave;m mất m&aacute;t l&agrave; một đại lượng quan trọng để ước t&iacute;nh hiệu suất của tr&igrave;nh tối ưu h&oacute;a.</p> <h4 id="ftoc-heading-6" class="ftwp-heading" style="text-align: justify;">Optimizer &ndash; Tr&igrave;nh tối ưu h&oacute;a</h4> <p style="text-align: justify;">H&agrave;m mất m&aacute;t l&agrave; một thước đo hiệu suất của m&ocirc; h&igrave;nh. Tr&igrave;nh tối ưu h&oacute;a sẽ gi&uacute;p cải thiện kết quả của mạng bằng c&aacute;ch t&iacute;nh to&aacute;n lại c&aacute;c trong số sao cho giảm được gi&aacute; trị h&agrave;m mất m&aacute;t. Trong tensorflow c&oacute; sẵn c&aacute;c tr&igrave;nh tối ưu h&oacute;a kh&aacute;c nhau, nhưng thuật to&aacute;n phổ biến nhất l&agrave; Stochastic Gradient Descent.</p> <p style="text-align: justify;">C&aacute;c tr&igrave;nh tối ưu h&oacute;a th&ocirc;ng thường l&agrave;:</p> <ul style="text-align: justify;"> <li>Momentum optimization,</li> <li>Nesterov Accelerated Gradient,</li> <li>AdaGrad,</li> <li>Adam optimization.</li> </ul> <h3 id="ftoc-heading-7" class="ftwp-heading" style="text-align: justify;">Hạn chế của mạng neural</h3> <h4 id="ftoc-heading-8" class="ftwp-heading" style="text-align: justify;"><strong>Overfitting &ndash; Qu&aacute; khớp</strong></h4> <p style="text-align: justify;">Một vấn đề phổ biến với mạng neural l&agrave; những kh&oacute; khăn trong việc tổng qu&aacute;t h&oacute;a dữ liệu kh&ocirc;ng nh&igrave;n thấy được. Một mạng neural xảy ra hiện tượng qu&aacute; khớp l&agrave; mạng đ&oacute; đạt kết quả rất tốt tr&ecirc;n bộ train nhưng khi gặp c&aacute;c dữ liệu chưa được học (bộ test) lại cho kết quả kh&ocirc;ng tốt.</p> <p style="text-align: justify;">Hiện tượng overfitting hay xảy ra khi m&ocirc; h&igrave;nh qu&aacute; phức tạp hoặc khi dữ liệu bị mất cần bằng.</p> <p style="text-align: justify;">Trong học m&aacute;y c&oacute; một sự đ&aacute;nh đổi giữa optimization v&agrave; generalization.</p> <p style="text-align: justify;"><strong>Optimize </strong>c&oacute; nghĩa l&agrave; một m&ocirc; h&igrave;nh đ&ograve;i hỏi phải t&igrave;m ra c&aacute;c tham số tốt nhất để giảm thiểu mất m&aacute;t với bộ training set c&ograve;n <strong>Generalization </strong>cho biết m&ocirc; h&igrave;nh hoạt động như thế n&agrave;o đối với dữ liệu chưa từng nh&igrave;n thấy.</p> <h4 id="ftoc-heading-9" class="ftwp-heading" style="text-align: justify;">K&iacute;ch thước mạng</h4> <p style="text-align: justify;">Một mạng nơ-ron c&oacute; qu&aacute; nhiều layers v&agrave; c&aacute;c đơn vị ẩn sẽ khiến cho mạng rất phức tạp. Một c&aacute;ch đơn giản để giảm độ phức tạp của mạng l&agrave; giảm k&iacute;ch thước của n&oacute;. Kh&ocirc;ng c&oacute; phương ph&aacute;p n&agrave;o tốt nhất để x&aacute;c định số layers. Bạn cần bắt đầu với một lượng nhỏ layer v&agrave; tăng k&iacute;ch thước của n&oacute; cho đến khi bạn thấy m&ocirc; h&igrave;nh ph&ugrave; hợp.</p> <h4 id="ftoc-heading-10" class="ftwp-heading" style="text-align: justify;">Điều chỉnh trọng số</h4> <p style="text-align: justify;">Một kỹ thuật ti&ecirc;u chuẩn để hạn chế hiện tượng qu&aacute; khớp l&agrave; th&ecirc;m c&aacute;c r&agrave;ng buộc v&agrave;o trọng số của mạng đ&acirc;y c&ograve;n được biết đến như l&agrave; kĩ thuật ch&iacute;nh quy h&oacute;a tham số, c&oacute; hai loại ch&iacute;nh quy h&oacute;a phổ biến:</p> <p style="text-align: justify;">L1: Lasso: Cost tỷ lệ với gi&aacute; trị tuyệt đối của hệ số trọng số</p> <p style="text-align: justify;">L2: Ridge: Cost tỷ lệ với b&igrave;nh phương gi&aacute; trị của hệ số trọng số.</p> <h4 id="ftoc-heading-11" class="ftwp-heading" style="text-align: justify;">Dropout</h4> <p style="text-align: justify;">Dropout (bỏ học) kh&aacute; hữu &iacute;ch để giảm t&igrave;nh trạng mạng Overfitting. Tham số kiểm so&aacute;t tỷ lệ dropout l&agrave; rate. Rate x&aacute;c định c&oacute; bao nhi&ecirc;u trọng số sẽ kh&ocirc;ng được học th&ocirc;ng thường rate hay được chọn từ 0.2 đến 0.5. V&iacute; dụ một layer n&agrave;o đ&oacute; của mạng c&oacute; rate dropout l&agrave; 0.2 th&igrave; điều n&agrave;y c&oacute; nghĩa l&agrave; trong l&uacute;c đ&agrave;o tạo chỉ 80% neuron của layer được học, 20% c&ograve;n lại sẽ kh&ocirc;ng được học v&agrave; việc lựa chọn n&ecirc;n bỏ neuron n&agrave;o sẽ được chọn ngẫu nhi&ecirc;n trong mỗi lần lặp.</p> <h3 id="ftoc-heading-12" class="ftwp-heading" style="text-align: justify;">Đ&agrave;o tạo mạng neural với TensorFlow</h3> <p style="text-align: justify;">Trong phần n&agrave;y ch&uacute;ng ta sẽ học c&aacute;ch đ&agrave;o tạo một mạng neural với TensorFlow ANN bằng c&aacute;ch sử dụng Bộ ước lượng DNNClassifier của API.</p> <p style="text-align: justify;">Ch&uacute;ng ta sẽ sử dụng tập dữ liệu MNIST để đ&agrave;o tạo mạng nơ-ron. Đ&agrave;o tạo một mạng nơ-ron với TensorFlow kh&ocirc;ng phức tạp lắm. Bước tiền xử l&yacute; tr&ocirc;ng giống hệt như trong c&aacute;c b&agrave;i viết trước. Bạn sẽ tiến h&agrave;nh như sau:</p> <ul style="text-align: justify;"> <li>Bước 1: Nhập dữ liệu</li> <li>Bước 2: Chuyển đổi dữ liệu</li> <li>Bước 3: X&acirc;y dựng tensor</li> <li>Bước 4: X&acirc;y dựng m&ocirc; h&igrave;nh</li> <li>Bước 5: Huấn luyện v&agrave; đ&aacute;nh gi&aacute; m&ocirc; h&igrave;nh</li> <li>Bước 6: Cải thiện m&ocirc; h&igrave;nh</li> </ul> <h4 id="ftoc-heading-13" class="ftwp-heading" style="text-align: justify;">Bước 1) Nhập dữ liệu</h4> <p style="text-align: justify;">Trước hết, bạn cần nhập thư viện cần thiết. Bạn c&oacute; thể nhập tập dữ liệu MNIST bằng c&aacute;ch sử dụng scikit learn như được hiển thị trong v&iacute; dụ về Mạng thần kinh TensorFlow b&ecirc;n dưới.</p> <p style="text-align: justify;">Bộ dữ liệu MNIST l&agrave; bộ dữ liệu thường được sử dụng để kiểm tra c&aacute;c kỹ thuật hoặc thuật to&aacute;n mới. Tập dữ liệu n&agrave;y l&agrave; tập hợp h&igrave;nh ảnh chữ số viết tay từ 0 đến 9 v&agrave; mỗi h&igrave;nh ảnh sẽ c&oacute; k&iacute;ch thước l&agrave; 28&times;28 pixel .</p> <div id="urvanov-syntax-highlighter-610fefa42a338988621284" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" style="text-align: justify;" data-settings=" minimize scroll-mouseover"> <div class="urvanov-syntax-highlighter-main"> <pre class="language-python"><code>import numpy as np import tensorflow as tf np.random.seed(1337)</code></pre> </div> </div> <p style="text-align: justify;">Để nhập dữ liệu v&agrave;o python, bạn c&oacute; thể sử dụng fetch_mldata từ scikit learn. D&aacute;n đường dẫn tệp b&ecirc;n trong fetch_mldata để t&igrave;m nạp dữ liệu.</p> <pre class="language-python"><code>from sklearn.datasets import fetch_mldata mnist = fetch_mldata(' path dữ liệu của bạn') print(mnist.data.shape) print(mnist.target.shape)</code></pre> <div id="urvanov-syntax-highlighter-610fefa42a347170589016" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" style="text-align: justify;" data-settings=" minimize scroll-mouseover"> <div class="urvanov-syntax-highlighter-main"> <pre class="language-python"><code>from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(mnist.data, mnist.target, test_size=0.2, random_state=42) y_train = y_train.astype(int) y_test = y_test.astype(int) batch_size =len(X_train) print(X_train.shape, y_train.shape,y_test.shape )</code></pre> </div> </div> <h4 id="ftoc-heading-14" class="ftwp-heading" style="text-align: justify;">Bước 2) Chuyển đổi dữ liệu</h4> <p style="text-align: justify;">Trong hướng dẫn trước, bạn đ&atilde; biết rằng bạn cần phải chuyển đổi dữ liệu để hạn chế ảnh hưởng của c&aacute;c yếu tố ngoại lệ. Trong b&agrave;i viết n&agrave;y bạn sẽ biến đổi dữ liệu bằng c&aacute;ch sử dụng min-max scaler.</p> <p style="text-align: justify;">C&ocirc;ng thức l&agrave;:</p> <div id="urvanov-syntax-highlighter-610fefa42a34c211710158" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" style="text-align: justify;" data-settings=" minimize scroll-mouseover"> <div class="urvanov-syntax-highlighter-main"> <pre class="language-python"><code>(X-min_x)/(max_x - min_x)</code></pre> </div> </div> <p style="text-align: justify;">Scikit learn đ&atilde; c&oacute; một h&agrave;m cho điều đ&oacute;: MinMaxScaler()</p> <div id="urvanov-syntax-highlighter-610fefa42a34e839673057" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" style="text-align: justify;" data-settings=" minimize scroll-mouseover"> <div class="urvanov-syntax-highlighter-main"> <pre class="language-python"><code>## resclae from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() # Train X_train_scaled = scaler.fit_transform(X_train.astype(np.float64)) # test X_test_scaled = scaler.fit_transform(X_test.astype(np.float64))</code></pre> </div> </div> <h4 id="ftoc-heading-15" class="ftwp-heading" style="text-align: justify;">Bước 3) X&acirc;y dựng tensor</h4> <p style="text-align: justify;">B&acirc;y giờ bạn đ&atilde; quen với c&aacute;ch tạo tensor trong Tensorflow. Bạn c&oacute; thể chuyển đổi trainset th&agrave;nh một cột số.</p> <div id="urvanov-syntax-highlighter-610fefa42a34f318663835" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" style="text-align: justify;" data-settings=" minimize scroll-mouseover"> <div class="urvanov-syntax-highlighter-main"> <pre class="language-python"><code>feature_columns = [tf.feature_column.numeric_column('x', shape=X_train_scaled.shape[1:])]</code></pre> </div> </div> <h4 id="ftoc-heading-16" class="ftwp-heading" style="text-align: justify;">Bước 4) X&acirc;y dựng m&ocirc; h&igrave;nh</h4> <p style="text-align: justify;">Kiến tr&uacute;c của mạng nơ-ron chứa 2 layers ẩn với 300 đơn vị cho layer đầu ti&ecirc;n v&agrave; 100 đơn vị cho layer thứ hai. Bạn c&oacute; thể điều chỉnh c&aacute;c gi&aacute; trị n&agrave;y v&agrave; xem n&oacute; ảnh hưởng như thế n&agrave;o đến độ ch&iacute;nh x&aacute;c của mạng.</p> <p style="text-align: justify;">Để x&acirc;y dựng m&ocirc; h&igrave;nh, ta sử dụng estimator DNNClassifier. Bạn c&oacute; thể th&ecirc;m số layer v&agrave;o đối số feature_columns. Bạn cần đặt số lớp th&agrave;nh 10 v&igrave; c&oacute; mười lớp trong tập huấn luyện. C&aacute;c đối số c&oacute; c&aacute;c cột, số lớp v&agrave; model_dir ho&agrave;n to&agrave;n giống như trong hướng dẫn trước. Đối số mới hidden_unit kiểm so&aacute;t số layer v&agrave; số lượng node cần kết nối với mạng nơ-ron. Trong đoạn m&atilde; dưới đ&acirc;y, c&oacute; hai layer ẩn với layer đầu ti&ecirc;n kết nối 300 node v&agrave; layer thứ hai với 100 node.</p> <p style="text-align: justify;">Để tạo estimator, h&atilde;y sử dụng tf.estimator.DNNClassifier với c&aacute;c tham số sau:</p> <ul style="text-align: justify;"> <li>feature_columns: X&aacute;c định c&aacute;c cột để sử dụng trong mạng</li> <li>hidden_units: X&aacute;c định số lượng nơ-ron ẩn</li> <li>n_classes: X&aacute;c định số lượng c&aacute;c lớp để dự đo&aacute;n</li> <li>model_dir: X&aacute;c định đường dẫn của TensorBoard</li> </ul> <div id="urvanov-syntax-highlighter-610fefa42a354105938718" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" style="text-align: justify;" data-settings=" minimize scroll-mouseover"> <div class="urvanov-syntax-highlighter-main"> <pre class="language-python"><code>estimator = tf.estimator.DNNClassifier( feature_columns=feature_columns, hidden_units=[300, 100], n_classes=10, model_dir = '/train/DNN')</code></pre> </div> </div> <h4 id="ftoc-heading-17" class="ftwp-heading" style="text-align: justify;">Bước 5) Đ&agrave;o tạo v&agrave; đ&aacute;nh gi&aacute; m&ocirc; h&igrave;nh</h4> <p style="text-align: justify;">C&oacute; thể sử dụng numpy để đ&agrave;o tạo m&ocirc; h&igrave;nh v&agrave; đ&aacute;nh gi&aacute; n&oacute;.</p> <div id="urvanov-syntax-highlighter-610fefa42a356015736937" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" style="text-align: justify;" data-settings=" minimize scroll-mouseover"> <div class="urvanov-syntax-highlighter-main"> <pre class="language-python"><code># Train the estimator train_input = tf.estimator.inputs.numpy_input_fn( x={"x": X_train_scaled}, y=y_train, batch_size=50, shuffle=False, num_epochs=None) estimator.train(input_fn = train_input,steps=1000) eval_input = tf.estimator.inputs.numpy_input_fn( x={"x": X_test_scaled}, y=y_test, shuffle=False, batch_size=X_test_scaled.shape[0], num_epochs=1) estimator.evaluate(eval_input,steps=None)</code></pre> </div> </div> <p style="text-align: justify;"><strong>Output</strong></p> <div id="urvanov-syntax-highlighter-610fefa42a358648903391" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" style="text-align: justify;" data-settings=" minimize scroll-mouseover"> <div class="urvanov-syntax-highlighter-main"> <pre class="language-python"><code>{'accuracy': 0.9637143, 'average_loss': 0.12014342, 'loss': 1682.0079, 'global_step': 1000}</code></pre> </div> </div> <p style="text-align: justify;">Kiến tr&uacute;c hiện tại dẫn đến độ ch&iacute;nh x&aacute;c tr&ecirc;n bộ đ&aacute;nh gi&aacute; l&agrave; 96%.</p> <h4 id="ftoc-heading-18" class="ftwp-heading" style="text-align: justify;">Bước 6) Cải thiện m&ocirc; h&igrave;nh</h4> <p style="text-align: justify;">C&oacute; thể cố gắng cải thiện m&ocirc; h&igrave;nh bằng c&aacute;ch th&ecirc;m c&aacute;c tham số ch&iacute;nh quy h&oacute;a.</p> <p style="text-align: justify;">Ch&uacute;ng ta sẽ sử dụng tr&igrave;nh tối ưu h&oacute;a Adam với tỷ lệ bỏ học l&agrave; 0,3, L1 l&agrave; X v&agrave; L2 l&agrave; y. Trong Mạng thần kinh TensorFlow, bạn c&oacute; thể điều khiển tr&igrave;nh tối ưu h&oacute;a bằng c&aacute;ch sử dụng nh&oacute;m đối tượng theo sau t&ecirc;n của tr&igrave;nh tối ưu h&oacute;a. TensorFlow l&agrave; một API t&iacute;ch hợp cho tr&igrave;nh tối ưu h&oacute;a Proximal AdaGrad.</p> <p style="text-align: justify;">Sử dụng tf.train.ProximalAdagradOptimizer với tham số sau:</p> <ul style="text-align: justify;"> <li>Learning rate: learning_rate</li> <li>L1 regularization: l1_regularization_strength</li> <li>L2 regularization: l2_regularization_strength</li> </ul> <div id="urvanov-syntax-highlighter-610fefa42a35a336969404" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" style="text-align: justify;" data-settings=" minimize scroll-mouseover"> <div class="urvanov-syntax-highlighter-main"> <pre class="language-python"><code>estimator_imp = tf.estimator.DNNClassifier( feature_columns=feature_columns, hidden_units=[300, 100], dropout=0.3, n_classes = 10, optimizer=tf.train.ProximalAdagradOptimizer( learning_rate=0.01, l1_regularization_strength=0.01, l2_regularization_strength=0.01 ), model_dir = '/train/DNN1') estimator_imp.train(input_fn = train_input,steps=1000) estimator_imp.evaluate(eval_input,steps=None)</code></pre> </div> </div> <p style="text-align: justify;"><strong>Output</strong></p> <div id="urvanov-syntax-highlighter-610fefa42a35b723336962" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" style="text-align: justify;" data-settings=" minimize scroll-mouseover"> <div class="urvanov-syntax-highlighter-main"> <pre class="language-python"><code>{'accuracy': 0.95057142, 'average_loss': 0.17318928, 'loss': 2424.6499, 'global_step': 2000}</code></pre> </div> </div> <p style="text-align: justify;">C&aacute;c gi&aacute; trị được chọn để giảm qu&aacute; khớp đ&atilde; kh&ocirc;ng cải thiện độ ch&iacute;nh x&aacute;c của m&ocirc; h&igrave;nh. M&ocirc; h&igrave;nh đầu ti&ecirc;n của bạn c&oacute; độ ch&iacute;nh x&aacute;c l&agrave; 96% trong khi đ&oacute; m&ocirc; h&igrave;nh sử dụng th&ecirc;m bộ điều chỉnh L2 c&oacute; độ ch&iacute;nh x&aacute;c l&agrave; 95%. Bạn c&oacute; thể thử với c&aacute;c gi&aacute; trị kh&aacute;c nhau v&agrave; xem n&oacute; ảnh hưởng như thế n&agrave;o đến độ ch&iacute;nh x&aacute;c.</p> <h3 id="ftoc-heading-19" class="ftwp-heading" style="text-align: justify;">Kết Luận</h3> <p style="text-align: justify;">Mạng nơron y&ecirc;u cầu:</p> <ul style="text-align: justify;"> <li>Số layers ẩn</li> <li>Số lượng node được kết nối đầy đủ</li> <li>H&agrave;m k&iacute;ch hoạt</li> <li>Tr&igrave;nh tối ưu h&oacute;a</li> <li>Số lớp</li> </ul> <p style="text-align: justify;">Trong TensorFlow ANN, bạn c&oacute; thể đ&agrave;o tạo mạng nơ-ron cho vấn đề ph&acirc;n loại với:</p> <ul style="text-align: justify;"> <li>tf.estimator.DNNClassifier</li> </ul> <p style="text-align: justify;">Estimator y&ecirc;u cầu x&aacute;c định:</p> <ul style="text-align: justify;"> <li>feature_columns=feature_columns</li> <li>hidden_units=[300, 100]</li> <li>n_classes=10</li> <li>model_dir</li> </ul> <p style="text-align: justify;">Bạn c&oacute; thể cải thiện m&ocirc; h&igrave;nh bằng c&aacute;ch sử dụng c&aacute;c tr&igrave;nh tối ưu h&oacute;a kh&aacute;c nhau. Trong hướng dẫn n&agrave;y, bạn đ&atilde; học c&aacute;ch sử dụng tr&igrave;nh tối ưu h&oacute;a Adam Grad với tốc độ học tập v&agrave; th&ecirc;m điều khiển để ngăn qu&aacute; khớp.</p> <p style="text-align: justify;">B&agrave;i viết tiếp theo:&nbsp;<a href="../../mang-neural-gioi-thieu-va-vi-du-tu-hoc-tensorflow/" target="_blank" rel="noopener">Giới thiệu mạng neural &ndash;&nbsp;V&iacute; dụ về TensorFlow ANN</a></p>