tek4

Recurrent Neural Network – Tự Học TensorFlow

by - September. 21, 2021
Kiến thức
<blockquote> <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 Recurrent Neural Network (RNN) v&agrave; c&aacute;ch sử dụng n&oacute; với v&iacute; dụ về Tensorflow. Bắt đầu th&ocirc;i!</p> </blockquote> <p style="text-align: justify;">Xem th&ecirc;m b&agrave;i viết trước:&nbsp;<a href="../../autoencoder-trong-deep-learning-tu-hoc-tensorflow/" target="_blank" rel="noopener">Autoencoder trong Deep Learning &ndash; V&iacute; dụ với TensorFlow</a></p> <p><img class="aligncenter size-full wp-image-7374 disappear appear" style="display: block; margin-left: auto; margin-right: auto;" src="../../wp-content/uploads/2021/01/16.png" sizes="(max-width: 1112px) 100vw, 1112px" srcset="https://old.tek4.vn/wp-content/uploads/2021/01/16.png 1112w, https://old.tek4.vn/wp-content/uploads/2021/01/16-300x156.png 300w, https://old.tek4.vn/wp-content/uploads/2021/01/16-1024x534.png 1024w, https://old.tek4.vn/wp-content/uploads/2021/01/16-768x401.png 768w" alt="Recurrent Neural Network" width="1112" height="580" loading="lazy" /></p> <p style="text-align: justify;">Cấu tr&uacute;c của một mạng neural nh&acirc;n tạo tương đối đơn giản v&agrave; chủ yếu l&agrave; về ph&eacute;p nh&acirc;n ma trận. Trong bước đầu ti&ecirc;n, đầu v&agrave;o được nh&acirc;n với trọng số ngẫu nhi&ecirc;n ban đầu v&agrave; độ lệch (bias), được biến đổi với một h&agrave;m k&iacute;ch hoạt (activation function) v&agrave; c&aacute;c gi&aacute; trị đầu ra được sử dụng để đưa ra dự đo&aacute;n.</p> <p style="text-align: justify;">Số liệu được &aacute;p dụng l&agrave; loss. H&agrave;m mất m&aacute;t c&agrave;ng cao th&igrave; m&ocirc; h&igrave;nh c&agrave;ng k&eacute;m. Để n&acirc;ng cao kiến ​​thức của mạng, cần c&oacute; một số tối ưu h&oacute;a bằng c&aacute;ch điều chỉnh trọng số của mạng. Stochastic gradient descent l&agrave; phương ph&aacute;p được sử dụng để thay đổi gi&aacute; trị của c&aacute;c trọng số. Sau khi điều chỉnh được thực hiện, mạng c&oacute; thể sử dụng một loạt dữ liệu kh&aacute;c để kiểm tra kiến ​​thức mới của mạng.</p> <p style="text-align: justify;">May mắn thay, sai số đ&atilde; giảm so với trước đ&acirc;y, nhưng kh&ocirc;ng đủ nhỏ. Bước tối ưu h&oacute;a được thực hiện lặp đi lặp lại cho đến khi lỗi được giảm thiểu, tức l&agrave; kh&ocirc;ng thể tr&iacute;ch xuất th&ecirc;m th&ocirc;ng tin n&agrave;o nữa.</p> <p style="text-align: justify;">Vấn đề với loại m&ocirc; h&igrave;nh n&agrave;y l&agrave; n&oacute; kh&ocirc;ng c&oacute; bất kỳ ghi nhớ n&agrave;o. N&oacute; c&oacute; nghĩa l&agrave; đầu v&agrave;o v&agrave; đầu ra l&agrave; độc lập. N&oacute;i c&aacute;ch kh&aacute;c, m&ocirc; h&igrave;nh kh&ocirc;ng quan t&acirc;m đến những g&igrave; đến trước đ&oacute;. N&oacute; đ&atilde; đặt ra một số c&acirc;u hỏi đ&oacute; l&agrave; khi bạn cần dự đo&aacute;n một b&agrave;i to&aacute;n n&agrave;o đ&oacute; m&agrave; cần c&oacute; th&ocirc;ng tin về dữ liệu trong qu&aacute; khứ.</p> <p style="text-align: justify;">Để khắc phục vấn đề n&agrave;y, một loại kiến ​​tr&uacute;c mới đ&atilde; được ph&aacute;t triển: Mạng neural hồi quy (Recurrent Neural network &ndash; RNN).</p> <h3 id="ftoc-heading-1" class="ftwp-heading" style="text-align: justify;">Recurrent Neural Network l&agrave; g&igrave;</h3> <p style="text-align: justify;">Recurrent neural network tr&ocirc;ng kh&aacute; giống với mạng neural truyền thống ngoại trừ việc một memory-state (trạng th&aacute;i bộ nhớ) được th&ecirc;m v&agrave;o c&aacute;c neural.</p> <p style="text-align: justify;">H&atilde;y tưởng tượng một m&ocirc; h&igrave;nh đơn giản chỉ c&oacute; một neural được cung cấp bởi một loạt dữ liệu. Trong mạng neural truyền thống, m&ocirc; h&igrave;nh tạo ra đầu ra bằng c&aacute;ch nh&acirc;n c&ugrave;ng một l&uacute;c tất cả đầu v&agrave;o với bộ trọng số sau đ&oacute; đi qua h&agrave;m k&iacute;ch hoạt. Với một RNN, đầu ra của nơ ron n&agrave;y sẽ sẽ được sử dụng để l&agrave;m cho đầu v&agrave;o của nơ ron tiếp theo (một nơ ron sẽ c&oacute; hai đầu v&agrave;o thứ nhất ch&iacute;nh l&agrave; đầu ra của nơ ron trước đ&oacute;, thứ hai ch&iacute;nh l&agrave; dữ liệu đầu v&agrave;o tại nơ ron đ&oacute;), đối với nơ ron đầu ti&ecirc;n kh&ocirc;ng c&oacute; nơ ron n&agrave;o trước n&oacute; th&igrave; đầu v&agrave;o n&agrave;y sẽ được khởi tạo mặc định. Trong c&aacute;c m&ocirc; h&igrave;nh về chuỗi như RNN th&igrave; ta hay gặp thuật ngữ timestep, timestep ch&iacute;nh l&agrave; khoảng thời gian đầu ra từ nơ ron n&agrave;y trở th&agrave;nh đầu v&agrave;o của ph&eacute;p t&iacute;nh to&aacute;n trong nơ ron tiếp theo.</p> <p style="text-align: justify;">V&iacute; dụ, trong h&igrave;nh b&ecirc;n dưới, bạn c&oacute; thể thấy mạng được cấu tạo bởi một neural. Mạng t&iacute;nh to&aacute;n ph&eacute;p nh&acirc;n ma trận giữa đầu v&agrave;o v&agrave; trọng số v&agrave; th&ecirc;m non-linearity (h&agrave;m k&iacute;ch hoạt). N&oacute; trở th&agrave;nh đầu ra tại t-1. Đầu ra n&agrave;y l&agrave; đầu v&agrave;o của ph&eacute;p nh&acirc;n ma trận thứ hai.</p> <p><img class="aligncenter size-full wp-image-7402 disappear appear" style="display: block; margin-left: auto; margin-right: auto;" src="../../wp-content/uploads/2021/01/082918_1006_RNNRecurren1.png" sizes="(max-width: 430px) 100vw, 430px" srcset="https://old.tek4.vn/wp-content/uploads/2021/01/082918_1006_RNNRecurren1.png 430w, https://old.tek4.vn/wp-content/uploads/2021/01/082918_1006_RNNRecurren1-300x216.png 300w" alt="" width="542" height="391" loading="lazy" /></p> <p style="text-align: justify;">Dưới đ&acirc;y, ch&uacute;ng ta viết m&atilde; RNN đơn giản trong TensorFlow để hiểu bước v&agrave; h&igrave;nh dạng của đầu ra.</p> <p style="text-align: justify;">Mạng bao gồm:</p> <ul style="text-align: justify;"> <li>Bốn đầu v&agrave;o</li> <li>S&aacute;u neurons</li> <li>2 lần bước (timestep)</li> </ul> <p style="text-align: justify;">Mạng sẽ tiến h&agrave;nh như được m&ocirc; tả trong h&igrave;nh b&ecirc;n dưới.</p> <p><img class="aligncenter size-full wp-image-8468 disappear appear" style="display: block; margin-left: auto; margin-right: auto;" src="../../wp-content/uploads/2021/02/082918_1006_RNNRecurren2.png" sizes="(max-width: 663px) 100vw, 663px" srcset="https://old.tek4.vn/wp-content/uploads/2021/02/082918_1006_RNNRecurren2.png 663w, https://old.tek4.vn/wp-content/uploads/2021/02/082918_1006_RNNRecurren2-300x195.png 300w, https://old.tek4.vn/wp-content/uploads/2021/02/082918_1006_RNNRecurren2-90x60.png 90w" alt="" width="543" height="355" loading="lazy" /></p> <p style="text-align: justify;">Mạng được gọi l&agrave; &lsquo;recurrent&rsquo; v&igrave; ta c&oacute; thể để &yacute; trong mỗi &ocirc; k&iacute;ch hoạt (c&oacute; thể gọi mỗi nơ ron) th&igrave; đều thực hiện c&aacute;c cộng việc giống nhau, đ&oacute; l&agrave; nhận 2 đầu v&agrave;o, sau đ&oacute; thực hiện t&iacute;nh to&aacute;n v&agrave; cho ra kết quả (đầu ra).</p> <div id="urvanov-syntax-highlighter-610ff07e17b32992131161" 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 n_inputs = 4 n_neurons = 6 n_timesteps = 2 The data is a sequence of a number from 0 to 9 and divided into three batches of data. ## Data X_batch = np.array([ [[0, 1, 2, 5], [9, 8, 7, 4]], # Batch 1 [[3, 4, 5, 2], [0, 0, 0, 0]], # Batch 2 [[6, 7, 8, 5], [6, 5, 4, 2]], # Batch 3 ])</code></pre> </div> </div> <p style="text-align: justify;">Ch&uacute;ng ta c&oacute; thể x&acirc;y dựng mạng với placeholder cho dữ liệu, giai đoạn lặp lại v&agrave; đầu ra.</p> <p style="text-align: justify;"><strong>X&aacute;c định placeholder cho dữ liệu:</strong></p> <div id="urvanov-syntax-highlighter-610ff07e17b47871650110" 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 = tf.placeholder(tf.float32, [None, n_timesteps, n_inputs])</code></pre> </div> </div> <p style="text-align: justify;">Tại đ&acirc;y:</p> <ul style="text-align: justify;"> <li>None: Kh&ocirc;ng x&aacute;c định v&agrave; sẽ c&oacute; batch size</li> <li>n_timesteps: Số bước thời gian mạng sẽ gửi đầu ra trở lại nơron</li> <li>n_inputs:&nbsp; Số lượng đầu v&agrave;o mỗi batch.</li> </ul> <p style="text-align: justify;"><strong>X&aacute;c định recurrent network&nbsp;</strong></p> <p style="text-align: justify;">Như đ&atilde; đề cập trong h&igrave;nh tr&ecirc;n, mạng lưới bao gồm 6 neurons. Mạng sẽ t&iacute;nh to&aacute;n:</p> <ul style="text-align: justify;"> <li>Dữ liệu đầu v&agrave;o với tập trọng số đầu ti&ecirc;n (tức l&agrave; 6: bằng số lượng neurons)</li> <li>Đầu ra trước với tập hợp trọng số thứ hai (tức l&agrave; 6: tương ứng với số lượng đầu ra)</li> </ul> <p style="text-align: justify;">Lưu &yacute; rằng, trong lần chuyển tiếp đầu ti&ecirc;n, c&aacute;c gi&aacute; trị của đầu ra trước đ&oacute; bằng 0 v&igrave; ch&uacute;ng ta kh&ocirc;ng c&oacute; sẵn bất kỳ gi&aacute; trị n&agrave;o.</p> <p style="text-align: justify;">Đối tượng để x&acirc;y dựng một RNN l&agrave; tf.contrib.rnn.BasicRNNCell với đối số num_units để x&aacute;c định số lượng đầu v&agrave;o.</p> <div id="urvanov-syntax-highlighter-610ff07e17b4d732098144" 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>basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=n_neurons)</code></pre> </div> </div> <p style="text-align: justify;">B&acirc;y giờ mạng đ&atilde; được x&aacute;c định, bạn c&oacute; thể t&iacute;nh to&aacute;n c&aacute;c đầu ra v&agrave; trạng th&aacute;i</p> <div id="urvanov-syntax-highlighter-610ff07e17b50641917364" 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>outputs, states = tf.nn.dynamic_rnn(basic_cell, X, dtype=tf.float32)</code></pre> </div> </div> <p style="text-align: justify;">Lưu &yacute; rằng nơron recurent l&agrave; một h&agrave;m của tất cả c&aacute;c đầu v&agrave;o của c&aacute;c bước thời gian trước đ&oacute;. Đ&acirc;y l&agrave; c&aacute;ch mạng x&acirc;y dựng bộ nhớ của ri&ecirc;ng n&oacute;.</p> <div id="urvanov-syntax-highlighter-610ff07e17b54036088199" 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>## Define the shape of the tensor X = tf.placeholder(tf.float32, [None, n_timesteps, n_inputs]) ## Define the network basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=n_neurons) outputs, states = tf.nn.dynamic_rnn(basic_cell, X, dtype=tf.float32) init = tf.global_variables_initializer() init = tf.global_variables_initializer() with tf.Session() as sess: init.run() outputs_val = outputs.eval(feed_dict={X: X_batch}) print(states.eval(feed_dict={X: X_batch})) [[ 0.38941205 -0.9980438 0.99750966 0.7892596 0.9978241 0.9999997 ] [ 0.61096436 0.7255889 0.82977575 -0.88226104 0.29261455 -0.15597084] [ 0.62091285 -0.87023467 0.99729395 -0.58261937 0.9811445 0.99969864]]</code></pre> </div> </div> <div id="urvanov-syntax-highlighter-610ff07e17b58156812705" 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>print(outputs_val) print(outputs_val.shape) [[[-0.75934666 -0.99537754 0.9735819 -0.9722234 -0.14234993 -0.9984044 ] [ 0.99975264 -0.9983206 0.9999993 -1. -0.9997506 -1. ]] [[ 0.97486496 -0.98773265 0.9969686 -0.99950117 -0.7092863 -0.99998885] [ 0.9326837 0.2673438 0.2808514 -0.7535883 -0.43337247 0.5700631 ]] [[ 0.99628735 -0.9998728 0.99999213 -0.99999976 -0.9884324 -1. ] [ 0.99962527 -0.9467421 0.9997403 -0.99999714 -0.99929446 -0.9999795 ]]] (3, 2, 6)</code></pre> </div> </div> <p><img class="aligncenter size-full wp-image-8521 disappear appear" style="display: block; margin-left: auto; margin-right: auto;" src="../../wp-content/uploads/2021/02/082918_1006_RNNRecurren3.png" sizes="(max-width: 1116px) 100vw, 1116px" srcset="https://old.tek4.vn/wp-content/uploads/2021/02/082918_1006_RNNRecurren3.png 1116w, https://old.tek4.vn/wp-content/uploads/2021/02/082918_1006_RNNRecurren3-300x154.png 300w, https://old.tek4.vn/wp-content/uploads/2021/02/082918_1006_RNNRecurren3-1024x525.png 1024w, https://old.tek4.vn/wp-content/uploads/2021/02/082918_1006_RNNRecurren3-768x394.png 768w" alt="" width="773" height="396" loading="lazy" /></p> <p style="text-align: justify;">Đầu ra c&oacute; dạng (3, 2, 6):</p> <ul style="text-align: justify;"> <li>3: Số batch</li> <li>2: Số bước thời gian</li> <li>6: Số lượng neurons</li> </ul> <p style="text-align: justify;">Việc tối ưu h&oacute;a recurrent neural network giống với mạng nơ-ron truyền thống.</p> <h3 id="ftoc-heading-2" class="ftwp-heading" style="text-align: justify;">C&aacute;c ứng dụng của RNN</h3> <p style="text-align: justify;">RNN c&oacute; nhiều c&ocirc;ng dụng, đặc biệt l&agrave; khi d&ugrave;ng để dự đo&aacute;n tương lai. Trong ng&agrave;nh t&agrave;i ch&iacute;nh, RNN c&oacute; thể hữu &iacute;ch trong việc dự đo&aacute;n gi&aacute; cổ phiếu hoặc dấu hiệu của xu hướng thị trường chứng kho&aacute;n (tức l&agrave; t&iacute;ch cực hoặc ti&ecirc;u cực).</p> <p style="text-align: justify;">RNN rất hữu &iacute;ch cho &ocirc; t&ocirc; tự l&aacute;i v&igrave; n&oacute; c&oacute; thể tr&aacute;nh tai nạn &ocirc; t&ocirc; bằng c&aacute;ch đo&aacute;n trước quỹ đạo của xe.</p> <p style="text-align: justify;">RNN được sử dụng rộng r&atilde;i trong ph&acirc;n t&iacute;ch văn bản, ch&uacute; th&iacute;ch h&igrave;nh ảnh, ph&acirc;n t&iacute;ch t&igrave;nh cảm v&agrave; dịch m&aacute;y. V&iacute; dụ, người ta c&oacute; thể sử dụng đ&aacute;nh gi&aacute; phim để hiểu cảm gi&aacute;c m&agrave; kh&aacute;n giả cảm nhận sau khi xem phim. Tự động h&oacute;a nhiệm vụ n&agrave;y rất hữu &iacute;ch khi c&ocirc;ng ty điện ảnh kh&ocirc;ng c&oacute; đủ thời gian để xem x&eacute;t, d&aacute;n nh&atilde;n, củng cố v&agrave; ph&acirc;n t&iacute;ch c&aacute;c b&agrave;i đ&aacute;nh gi&aacute;. M&aacute;y c&oacute; thể thực hiện c&ocirc;ng việc với mức độ ch&iacute;nh x&aacute;c cao hơn.</p> <h3 id="ftoc-heading-3" class="ftwp-heading" style="text-align: justify;">Hạn chế của RNN</h3> <p style="text-align: justify;">Về l&yacute; thuyết, RNN được cho l&agrave; mang th&ocirc;ng tin cập nhật. Tuy nhi&ecirc;n, việc tuy&ecirc;n truyền tất cả những th&ocirc;ng tin n&agrave;y l&agrave; một việc kh&aacute; kh&oacute; khăn khi bước thời gian qu&aacute; d&agrave;i. Khi một mạng c&oacute; qu&aacute; nhiều lớp s&acirc;u, n&oacute; trở n&ecirc;n kh&ocirc;ng thể kiểm tra được. Vấn đề n&agrave;y được gọi l&agrave;:&nbsp;<strong>vanishing gradient problem</strong>. Nếu bạn nhớ, mạng nơ-ron cập nhật trọng số bằng c&aacute;ch sử dụng thuật to&aacute;n gradient descent. C&aacute;c gradient nhỏ hơn khi mạng tiến xuống c&aacute;c lớp thấp hơn.</p> <p style="text-align: justify;">T&oacute;m lại, độ dốc kh&ocirc;ng đổi c&oacute; nghĩa l&agrave; kh&ocirc;ng c&oacute; kh&ocirc;ng gian để cải thiện. M&ocirc; h&igrave;nh học từ sự thay đổi trong gradient; Sự thay đổi n&agrave;y ảnh hưởng đến đầu ra của mạng. Tuy nhi&ecirc;n, nếu sự kh&aacute;c biệt về độ dốc qu&aacute; nhỏ (nghĩa l&agrave; trọng số thay đổi một ch&uacute;t), mạng kh&ocirc;ng thể học được bất cứ điều g&igrave;. Do đ&oacute;, một mạng đối mặt với vấn đề gradient biến mất kh&ocirc;ng thể hội tụ về một giải ph&aacute;p tốt.</p> <h3 id="ftoc-heading-4" class="ftwp-heading" style="text-align: justify;">Cải tiến LSTM</h3> <p style="text-align: justify;">Để khắc phục vấn đề tiềm ẩn về độ dốc biến mất m&agrave; RNN phải đối mặt, ba nh&agrave; nghi&ecirc;n cứu, Hochreiter, Schmidhuber v&agrave; Bengio đ&atilde; cải tiến RNN với một kiến ​​tr&uacute;c được gọi l&agrave; Long Short-Term Memory (LSTM). T&oacute;m lại, LSMT cung cấp cho mạng lưới th&ocirc;ng tin li&ecirc;n quan đến qu&aacute; khứ cho đến thời điểm gần đ&acirc;y. M&aacute;y sử dụng một kiến ​​tr&uacute;c tốt hơn để chọn v&agrave; chuyển th&ocirc;ng tin về sau.</p> <p style="text-align: justify;">Kiến tr&uacute;c LSTM c&oacute; sẵn trong TensorFlow, tf.contrib.rnn.LSTMCell. Bạn c&oacute; thể tham khảo&nbsp;<a href="https://www.tensorflow.org/api_docs/python/tf/compat/v1/nn/rnn_cell/LSTMCell" target="_blank" rel="noopener">t&agrave;i liệu ch&iacute;nh thức</a>&nbsp;để biết th&ecirc;m th&ocirc;ng tin.</p> <h3 id="ftoc-heading-5" class="ftwp-heading" style="text-align: justify;">RNN in time series</h3> <p style="text-align: justify;">Trong b&agrave;i viết n&agrave;y, bạn sẽ sử dụng RNN với dữ liệu time series. Time series phụ thuộc v&agrave;o thời gian trước đ&oacute; c&oacute; nghĩa l&agrave; c&aacute;c gi&aacute; trị trong qu&aacute; khứ bao gồm th&ocirc;ng tin c&oacute; li&ecirc;n quan m&agrave; mạng c&oacute; thể học hỏi. &Yacute; tưởng đằng sau dự đo&aacute;n time series l&agrave; ước t&iacute;nh gi&aacute; trị tương lai của một series, giả sử gi&aacute; cổ phiếu, nhiệt độ, GDP, v.v.</p> <p style="text-align: justify;">Việc chuẩn bị dữ liệu cho Keras RNN v&agrave; time series c&oacute; thể hơi phức tạp. Trước hết, mục ti&ecirc;u l&agrave; dự đo&aacute;n gi&aacute; trị tiếp theo của series, nghĩa l&agrave;, bạn sẽ sử dụng th&ocirc;ng tin trong qu&aacute; khứ để ước t&iacute;nh gi&aacute; trị tại t + 1. Nh&atilde;n bằng với tr&igrave;nh tự đầu v&agrave;o v&agrave; được dịch chuyển trước một khoảng thời gian. Thứ hai, số lượng đầu v&agrave;o được đặt th&agrave;nh 1, tức l&agrave; một lần quan s&aacute;t mỗi lần. Cuối c&ugrave;ng, bước thời gian bằng với chuỗi gi&aacute; trị số. V&iacute; dụ: nếu bạn đặt bước thời gian th&agrave;nh 10, chuỗi đầu v&agrave;o sẽ trả về mười lần li&ecirc;n tiếp.</p> <p style="text-align: justify;">Nh&igrave;n v&agrave;o biểu đồ b&ecirc;n dưới, ch&uacute;ng ta đ&atilde; đại diện cho dữ liệu time series ở b&ecirc;n tr&aacute;i v&agrave; một chuỗi đầu v&agrave;o giả tưởng ở b&ecirc;n phải.</p> <div id="urvanov-syntax-highlighter-610ff07e17b61362085159" 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-plain-wrap">&nbsp;</div> <div class="urvanov-syntax-highlighter-main"> <pre class="language-python"><code># To plot pretty figures %matplotlib inline import matplotlib import matplotlib.pyplot as plt import pandas as pd def create_ts(start = '2001', n = 201, freq = 'M'): rng = pd.date_range(start=start, periods=n, freq=freq) ts = pd.Series(np.random.uniform(-18, 18, size=len(rng)), rng).cumsum() return ts ts= create_ts(start = '2001', n = 192, freq = 'M') ts.tail(5)</code></pre> </div> </div> <p style="text-align: justify;"><strong>Output</strong></p> <div id="urvanov-syntax-highlighter-610ff07e17b6b311520873" 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>2016-08-31 -93.459631 2016-09-30 -95.264791 2016-10-31 -95.551935 2016-11-30 -105.879611 2016-12-31 -123.729319 Freq: M, dtype: float64</code></pre> </div> </div> <div id="urvanov-syntax-highlighter-610ff07e17b6f147608072" 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>ts = create_ts(start = '2001', n = 222) # Left plt.figure(figsize=(11,4)) plt.subplot(121) plt.plot(ts.index, ts) plt.plot(ts.index[90:100], ts[90:100], "b-", linewidth=3, label="A training instance") plt.title("A time series (generated)", fontsize=14) # Right plt.subplot(122) plt.title("A training instance", fontsize=14) plt.plot(ts.index[90:100], ts[90:100], "b-", markersize=8, label="instance") plt.plot(ts.index[91:101], ts[91:101], "bo", markersize=10, label="target", markerfacecolor='red') plt.legend(loc="upper left") plt.xlabel("Time") plt.show()</code></pre> </div> </div> <p><img class="aligncenter size-full wp-image-8546 disappear appear" style="display: block; margin-left: auto; margin-right: auto;" src="../../wp-content/uploads/2021/02/082918_1006_RNNRecurren4.png" sizes="(max-width: 799px) 100vw, 799px" srcset="https://old.tek4.vn/wp-content/uploads/2021/02/082918_1006_RNNRecurren4.png 799w, https://old.tek4.vn/wp-content/uploads/2021/02/082918_1006_RNNRecurren4-300x144.png 300w, https://old.tek4.vn/wp-content/uploads/2021/02/082918_1006_RNNRecurren4-768x368.png 768w" alt="" width="780" height="374" loading="lazy" /></p> <p style="text-align: justify;">Phần b&ecirc;n phải của biểu đồ hiển thị tất cả c&aacute;c series. N&oacute; bắt đầu từ năm 2001 v&agrave; kết th&uacute;c v&agrave;o năm 2019 Kh&ocirc;ng c&oacute; &yacute; nghĩa g&igrave; khi cung cấp tất cả dữ liệu trong mạng, thay v&agrave;o đ&oacute;, bạn cần tạo một loạt dữ liệu c&oacute; độ d&agrave;i bằng bước thời gian. Batch n&agrave;y sẽ l&agrave; biến X. Biến Y giống với X nhưng thay đổi theo một chu kỳ (tức l&agrave; bạn muốn dự b&aacute;o t + 1).</p> <p style="text-align: justify;">Cả hai vectơ đều c&oacute; c&ugrave;ng độ d&agrave;i. Bạn c&oacute; thể thấy n&oacute; ở phần b&ecirc;n phải của biểu đồ tr&ecirc;n. D&ograve;ng biểu thị mười gi&aacute; trị của đầu v&agrave;o X, trong khi c&aacute;c chấm m&agrave;u đỏ l&agrave; mười gi&aacute; trị của nh&atilde;n Y. Lưu &yacute; rằng, nh&atilde;n bắt đầu trước X một khoảng thời gian v&agrave; kết th&uacute;c sau một khoảng thời gian.</p> <h3 id="ftoc-heading-6" class="ftwp-heading" style="text-align: justify;">X&acirc;y dựng RNN để dự đo&aacute;n Time Series trong TensorFlow</h3> <p style="text-align: justify;">Bạn cần chỉ định một số si&ecirc;u tham số (c&aacute;c tham số của m&ocirc; h&igrave;nh, tức l&agrave; số lượng neurons, v.v.) cho m&ocirc; h&igrave;nh:</p> <ul style="text-align: justify;"> <li>Số lượng đầu v&agrave;o: 1</li> <li>Bước thời gian (c&aacute;c cửa sổ trong chuỗi thời gian): 10</li> <li>Số lượng neurons: 120</li> <li>Số lượng đầu ra: 1</li> </ul> <p style="text-align: justify;">Mạng của bạn sẽ học từ một chuỗi 10 ng&agrave;y v&agrave; chứa 120 neurons lặp lại. Bạn cung cấp m&ocirc; h&igrave;nh bằng một đầu v&agrave;o, tức l&agrave; một ng&agrave;y. Vui l&ograve;ng thay đổi c&aacute;c gi&aacute; trị để xem m&ocirc; h&igrave;nh c&oacute; được cải thiện hay kh&ocirc;ng.</p> <p style="text-align: justify;">Trước khi x&acirc;y dựng m&ocirc; h&igrave;nh, bạn cần chia tập dữ liệu th&agrave;nh tập train set v&agrave; test set. Bộ dữ liệu đầy đủ c&oacute; 222 điểm dữ liệu; Bạn sẽ sử dụng 201 điểm đầu ti&ecirc;n để huấn luyện m&ocirc; h&igrave;nh v&agrave; 21 điểm cuối c&ugrave;ng để kiểm tra m&ocirc; h&igrave;nh của bạn.</p> <p style="text-align: justify;">Sau khi bạn x&aacute;c định một tập hợp train v&agrave; test set, bạn cần tạo một đối tượng chứa c&aacute;c batches. Trong batch n&agrave;y, bạn c&oacute; gi&aacute; trị X v&agrave; gi&aacute; trị Y. H&atilde;y nhớ rằng c&aacute;c gi&aacute; trị X bị trễ một khoảng thời gian. Do đ&oacute;, bạn sử dụng 200 quan s&aacute;t đầu ti&ecirc;n v&agrave; bước thời gian bằng 10. Đối tượng X_batches phải chứa 20 batches c&oacute; k&iacute;ch thước 10 * 1. Y_batches c&oacute; c&ugrave;ng h&igrave;nh dạng với đối tượng X_batches nhưng c&oacute; một dấu chấm ph&iacute;a trước.</p> <p style="text-align: justify;"><strong>Bước 1: Tạo train v&agrave; test set</strong></p> <div id="urvanov-syntax-highlighter-610ff07e17b75010933706" 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>series = np.array(ts) n_windows = 20 n_input = 1 n_output = 1 size_train = 201</code></pre> </div> </div> <p style="text-align: justify;">Sau đ&oacute;, bạn chỉ cần chia mảng th&agrave;nh hai tập dữ liệu.</p> <div id="urvanov-syntax-highlighter-610ff07e17b7c604463084" 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>## Split data train = series[:size_train] test = series[size_train:] print(train.shape, test.shape) (201,) (21,)</code></pre> </div> </div> <p style="text-align: justify;"><strong>Bước 2: Tạo h&agrave;m trả về X_batches v&agrave; y_batches</strong></p> <p style="text-align: justify;">Để dễ d&agrave;ng hơn, bạn c&oacute; thể tạo một h&agrave;m trả về hai mảng kh&aacute;c nhau, một cho X_batches v&agrave; một cho y_batches.</p> <p style="text-align: justify;">H&atilde;y viết một h&agrave;m RNN TensorFlow để x&acirc;y dựng c&aacute;c batches.</p> <p style="text-align: justify;">Lưu &yacute; rằng, c&aacute;c batches X bị trễ một khoảng thời gian (ch&uacute;ng ta lấy gi&aacute; trị t-1). Đầu ra của h&agrave;m phải c&oacute; ba chiều. K&iacute;ch thước đầu ti&ecirc;n bằng số batch, thứ hai l&agrave; k&iacute;ch thước của cửa sổ v&agrave; cuối c&ugrave;ng l&agrave; số lượng đầu v&agrave;o.</p> <p style="text-align: justify;">Phần kh&oacute; l&agrave; chọn c&aacute;c điểm dữ liệu một c&aacute;ch ch&iacute;nh x&aacute;c. Đối với điểm dữ liệu X, bạn chọn c&aacute;c quan s&aacute;t từ t = 1 đến t = 200, trong khi đối với điểm dữ liệu Y, bạn trả lại c&aacute;c quan s&aacute;t từ t = 2 đến 201. Khi bạn c&oacute; c&aacute;c điểm dữ liệu ch&iacute;nh x&aacute;c, việc định h&igrave;nh lại chuỗi sẽ trở n&ecirc;n dễ d&agrave;ng.</p> <p style="text-align: justify;">Để x&acirc;y dựng đối tượng với c&aacute;c batches, bạn cần chia tập dữ liệu th&agrave;nh mười batches c&oacute; độ d&agrave;i bằng nhau (tức l&agrave; 20). Bạn c&oacute; thể sử dụng phương ph&aacute;p reshape v&agrave; chuyển -1 để chuỗi tương tự với batch size.Gi&aacute; trị 20 l&agrave; số lần quan s&aacute;t mỗi đợt v&agrave; 1 l&agrave; số lượng đầu v&agrave;o.</p> <p style="text-align: justify;">Bạn cần thực hiện bước tương tự nhưng đối với nh&atilde;n.</p> <p style="text-align: justify;">Lưu &yacute; rằng, bạn cần chuyển dữ liệu sang số thời gian bạn muốn dự b&aacute;o. V&iacute; dụ: nếu bạn muốn dự đo&aacute;n một mốc thời gian, th&igrave; bạn thay đổi chuỗi đ&oacute; 1. Nếu bạn muốn dự b&aacute;o hai ng&agrave;y, h&atilde;y dịch chuyển dữ liệu đi 2 ng&agrave;y.</p> <div id="urvanov-syntax-highlighter-610ff07e17b81274329870" 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_data = train[:size_train-1]: Select all the training instance minus one day X_batches = x_data.reshape(-1, windows, input): create the right shape for the batch e.g (10, 20, 1) def create_batches(df, windows, input, output): ## Create X x_data = train[:size_train-1] # Select the data X_batches = x_data.reshape(-1, windows, input) # Reshape the data ## Create y y_data = train[n_output:size_train] y_batches = y_data.reshape(-1, windows, output) return X_batches, y_batches</code></pre> </div> </div> <p style="text-align: justify;">B&acirc;y giờ h&agrave;m đ&atilde; được x&aacute;c định, bạn c&oacute; thể gọi n&oacute; để tạo c&aacute;c batches như thể hiện trong v&iacute; dụ RNN b&ecirc;n dưới.</p> <div id="urvanov-syntax-highlighter-610ff07e17b85714363211" 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-markup"><code>X_batches, y_batches = create_batches(df = train, windows = n_windows, input = n_input, output = n_output)</code></pre> </div> </div> <p style="text-align: justify;">Bạn c&oacute; thể in shape để đảm bảo k&iacute;ch thước ch&iacute;nh x&aacute;c.</p> <div id="urvanov-syntax-highlighter-610ff07e17b89129019912" 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>print(X_batches.shape, y_batches.shape) (10, 20, 1) (10, 20, 1)</code></pre> </div> </div> <p style="text-align: justify;">Bạn cần tạo bộ thử nghiệm chỉ với một batch dữ liệu v&agrave; 20 quan s&aacute;t.</p> <p style="text-align: justify;">Lưu &yacute; rằng, bạn dự b&aacute;o ng&agrave;y n&agrave;y qua ng&agrave;y kh&aacute;c, điều đ&oacute; c&oacute; nghĩa l&agrave; gi&aacute; trị dự đo&aacute;n thứ hai sẽ dựa tr&ecirc;n gi&aacute; trị thực của ng&agrave;y đầu ti&ecirc;n (t + 1) của tập dữ liệu thử nghiệm. Tr&ecirc;n thực tế, gi&aacute; trị thực sẽ được biết.</p> <p style="text-align: justify;">Nếu bạn muốn dự b&aacute;o t + 2 (tức l&agrave; hai ng&agrave;y trước), bạn cần sử dụng gi&aacute; trị dự đo&aacute;n t + 1; Nếu bạn định dự đo&aacute;n t + 3 (ba ng&agrave;y tới), bạn cần sử dụng gi&aacute; trị dự đo&aacute;n t + 1 v&agrave; t + 2. C&oacute; nghĩa rằng, rất kh&oacute; để dự đo&aacute;n ch&iacute;nh x&aacute;c t + n ng&agrave;y tới.</p> <div id="urvanov-syntax-highlighter-610ff07e17b8d889148158" 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_test, y_test = create_batches(df = test, windows = 20,input = 1, output = 1) print(X_test.shape, y_test.shape) (10, 20, 1) (10, 20, 1)</code></pre> </div> </div> <p style="text-align: justify;"><strong>Bước 3: X&acirc;y dựng m&ocirc; h&igrave;nh</strong></p> <p style="text-align: justify;">Để tạo m&ocirc; h&igrave;nh, bạn cần x&aacute;c định ba phần:</p> <ol style="text-align: justify;"> <li>Biến với tensor</li> <li>RNN</li> <li>Mất m&aacute;t v&agrave; tối ưu h&oacute;a</li> </ol> <p style="text-align: justify;"><strong>Bước 3.1: C&aacute;c biến</strong></p> <p style="text-align: justify;">Bạn cần chỉ định c&aacute;c biến X v&agrave; y c&oacute; h&igrave;nh dạng th&iacute;ch hợp. Tensor c&oacute; c&ugrave;ng dimension với c&aacute;c đối tượng X_batches v&agrave; y_batches.</p> <p style="text-align: justify;">Kết quả l&agrave;:</p> <pre class="language-python"><code>tf.placeholder(tf.float32, [None, n_windows, n_input])</code></pre> <div id="urvanov-syntax-highlighter-610ff07e17b93976498112" 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>## 1. Construct the tensors X = tf.placeholder(tf.float32, [None, n_windows, n_input]) y = tf.placeholder(tf.float32, [None, n_windows, n_output])</code></pre> </div> </div> <p style="text-align: justify;"><strong>Bước 3.2: Tạo RNN</strong></p> <p style="text-align: justify;">Trong phần thứ hai của v&iacute; dụ RNN TensorFlow n&agrave;y, bạn cần x&aacute;c định kiến ​​tr&uacute;c của mạng. Như trước đ&acirc;y, bạn sử dụng đối tượng BasicRNNCell v&agrave; dynamic_rnn từ c&ocirc;ng cụ ước lượng TensorFlow.</p> <div id="urvanov-syntax-highlighter-610ff07e17b9a908067949" 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>## 2. create the model basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=r_neuron, activation=tf.nn.relu) rnn_output, states = tf.nn.dynamic_rnn(basic_cell, X, dtype=tf.float32)</code></pre> </div> </div> <p style="text-align: justify;">Phần tiếp theo phức tạp hơn một ch&uacute;t nhưng cho ph&eacute;p t&iacute;nh to&aacute;n nhanh hơn. Bạn cần chuyển đổi đầu ra chạy th&agrave;nh một dense layer v&agrave; sau đ&oacute; chuyển đổi lại n&oacute; để c&oacute; c&ugrave;ng dimension với đầu v&agrave;o.</p> <div id="urvanov-syntax-highlighter-610ff07e17b9e564543067" 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>stacked_rnn_output = tf.reshape(rnn_output, [-1, r_neuron]) stacked_outputs = tf.layers.dense(stacked_rnn_output, n_output) outputs = tf.reshape(stacked_outputs, [-1, n_windows, n_output])</code></pre> </div> </div> <p style="text-align: justify;"><strong>Bước 3.3: Mất m&aacute;t v&agrave; tối ưu h&oacute;a</strong></p> <p style="text-align: justify;">Việc tối ưu h&oacute;a m&ocirc; h&igrave;nh phụ thuộc v&agrave;o nhiệm vụ bạn đang thực hiện. Trong hướng dẫn trước tr&ecirc;n CNN, mục ti&ecirc;u của bạn l&agrave; ph&acirc;n loại h&igrave;nh ảnh, trong hướng dẫn RNN n&agrave;y, mục ti&ecirc;u hơi kh&aacute;c. Bạn được y&ecirc;u cầu đưa ra dự đo&aacute;n về một biến li&ecirc;n tục so với một lớp.</p> <p style="text-align: justify;">Sự kh&aacute;c biệt n&agrave;y rất quan trọng v&igrave; n&oacute; sẽ thay đổi vấn đề tối ưu h&oacute;a. Vấn đề tối ưu h&oacute;a cho một biến li&ecirc;n tục l&agrave; giảm thiểu sai số b&igrave;nh phương trung b&igrave;nh. Để x&acirc;y dựng c&aacute;c chỉ số n&agrave;y trong TF, bạn c&oacute; thể sử dụng:</p> <ul style="text-align: justify;"> <li>tf.reduce_sum(tf.square(outputs &ndash; y))</li> </ul> <p style="text-align: justify;">Phần c&ograve;n lại của m&atilde; RNN giống như trước đ&acirc;y; Bạn sử dụng tr&igrave;nh tối ưu h&oacute;a Adam để giảm tổn thất (tức l&agrave; MSE):</p> <ul style="text-align: justify;"> <li>tf.train.AdamOptimizer(learning_rate=learning_rate)</li> <li>optimizer.minimize(loss)</li> </ul> <p style="text-align: justify;">Vậy l&agrave; xong, bạn c&oacute; thể đ&oacute;ng g&oacute;i mọi thứ lại với nhau v&agrave; m&ocirc; h&igrave;nh của bạn đ&atilde; sẵn s&agrave;ng để đ&agrave;o tạo.</p> <div id="urvanov-syntax-highlighter-610ff07e17ba2487347929" 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>tf.reset_default_graph() r_neuron = 120 ## 1. Construct the tensors X = tf.placeholder(tf.float32, [None, n_windows, n_input]) y = tf.placeholder(tf.float32, [None, n_windows, n_output]) ## 2. create the model basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=r_neuron, activation=tf.nn.relu) rnn_output, states = tf.nn.dynamic_rnn(basic_cell, X, dtype=tf.float32) stacked_rnn_output = tf.reshape(rnn_output, [-1, r_neuron]) stacked_outputs = tf.layers.dense(stacked_rnn_output, n_output) outputs = tf.reshape(stacked_outputs, [-1, n_windows, n_output]) ## 3. Loss + optimization learning_rate = 0.001 loss = tf.reduce_sum(tf.square(outputs - y)) optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate) training_op = optimizer.minimize(loss) init = tf.global_variables_initializer()</code></pre> </div> </div> <p style="text-align: justify;">Bạn sẽ đ&agrave;o tạo m&ocirc; h&igrave;nh bằng c&aacute;ch sử dụng 1500 epochs v&agrave; in ra gi&aacute; trị loss sau mỗi 150 lần lặp. Sau khi m&ocirc; h&igrave;nh được đ&agrave;o tạo, bạn đ&aacute;nh gi&aacute; m&ocirc; h&igrave;nh tr&ecirc;n tập kiểm tra v&agrave; tạo một đối tượng chứa c&aacute;c dự đo&aacute;n như được hiển thị trong v&iacute; dụ Recurrent Neural Network b&ecirc;n dưới.</p> <div id="urvanov-syntax-highlighter-610ff07e17ba7277685945" 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>iteration = 1500 with tf.Session() as sess: init.run() for iters in range(iteration): sess.run(training_op, feed_dict={X: X_batches, y: y_batches}) if iters % 150 == 0: mse = loss.eval(feed_dict={X: X_batches, y: y_batches}) print(iters, "\tMSE:", mse) y_pred = sess.run(outputs, feed_dict={X: X_test}) 0 MSE: 502893.34 150 MSE: 13839.129 300 MSE: 3964.835 450 MSE: 2619.885 600 MSE: 2418.772 750 MSE: 2110.5923 900 MSE: 1887.9644 1050 MSE: 1747.1377 1200 MSE: 1556.3398 1350 MSE: 1384.6113</code></pre> </div> </div> <p style="text-align: justify;">Cuối c&ugrave;ng trong b&agrave;i viết học s&acirc;u RNN n&agrave;y, bạn c&oacute; thể vẽ biểu đồ gi&aacute; trị thực của chuỗi với gi&aacute; trị dự đo&aacute;n. Nếu m&ocirc; h&igrave;nh của bạn được sửa chữa, c&aacute;c gi&aacute; trị dự đo&aacute;n phải được đặt tr&ecirc;n c&aacute;c gi&aacute; trị thực tế.</p> <p style="text-align: justify;">Như bạn c&oacute; thể thấy, m&ocirc; h&igrave;nh c&oacute; nhiều điểm cải tiến.</p> <div id="urvanov-syntax-highlighter-610ff07e17bae082083738" 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>plt.title("Forecast vs Actual", fontsize=14) plt.plot(pd.Series(np.ravel(y_test)), "bo", markersize=8, label="Actual", color='green') plt.plot(pd.Series(np.ravel(y_pred)), "r.", markersize=8, label="Forecast", color='red') plt.legend(loc="lower left") plt.xlabel("Time") plt.show()</code></pre> </div> </div> <p><img class="aligncenter wp-image-8548 size-full disappear appear" style="display: block; margin-left: auto; margin-right: auto;" src="../../wp-content/uploads/2021/02/082918_1006_RNNRecurren5.png" sizes="(max-width: 515px) 100vw, 515px" srcset="https://old.tek4.vn/wp-content/uploads/2021/02/082918_1006_RNNRecurren5.png 515w, https://old.tek4.vn/wp-content/uploads/2021/02/082918_1006_RNNRecurren5-300x217.png 300w, https://old.tek4.vn/wp-content/uploads/2021/02/082918_1006_RNNRecurren5-278x202.png 278w, https://old.tek4.vn/wp-content/uploads/2021/02/082918_1006_RNNRecurren5-373x270.png 373w, https://old.tek4.vn/wp-content/uploads/2021/02/082918_1006_RNNRecurren5-475x342.png 475w" alt="Recurrent Neural Network" width="558" height="402" loading="lazy" /></p> <h3 id="ftoc-heading-7" class="ftwp-heading" style="text-align: justify;">Kết Luận</h3> <p style="text-align: justify;">Recurrent Neural Network l&agrave; một kiến ​​tr&uacute;c mạnh mẽ để xử l&yacute; chuỗi thời gian hoặc ph&acirc;n t&iacute;ch văn bản. Đầu ra của trạng th&aacute;i trước đ&oacute; l&agrave; phản hồi để bảo to&agrave;n bộ nhớ của mạng theo thời gian hoặc chuỗi từ.</p> <p style="text-align: justify;">Trong TensorFlow, bạn c&oacute; thể sử dụng c&aacute;c m&atilde; sau để đ&agrave;o tạo Recurrent Neural Network TensorFlow cho chuỗi thời gian:</p> <h4 id="ftoc-heading-8" class="ftwp-heading" style="text-align: justify;">C&aacute;c tham số của m&ocirc; h&igrave;nh</h4> <div id="urvanov-syntax-highlighter-610ff07e17bb2257185933" 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>n_windows = 20 n_input = 1 n_output = 1 size_train = 201</code></pre> </div> </div> <h4 id="ftoc-heading-9" class="ftwp-heading" style="text-align: justify;">X&aacute;c định m&ocirc; h&igrave;nh</h4> <div id="urvanov-syntax-highlighter-610ff07e17bb6598554346" 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 = tf.placeholder(tf.float32, [None, n_windows, n_input]) y = tf.placeholder(tf.float32, [None, n_windows, n_output]) basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=r_neuron, activation=tf.nn.relu) rnn_output, states = tf.nn.dynamic_rnn(basic_cell, X, dtype=tf.float32) stacked_rnn_output = tf.reshape(rnn_output, [-1, r_neuron]) stacked_outputs = tf.layers.dense(stacked_rnn_output, n_output) outputs = tf.reshape(stacked_outputs, [-1, n_windows, n_output])</code></pre> </div> </div> <h4 id="ftoc-heading-10" class="ftwp-heading" style="text-align: justify;">X&acirc;y dựng tối ưu h&oacute;a</h4> <div id="urvanov-syntax-highlighter-610ff07e17bba703371817" 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>learning_rate = 0.001 loss = tf.reduce_sum(tf.square(outputs - y)) optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate) training_op = optimizer.minimize(loss)</code></pre> </div> </div> <h4 id="ftoc-heading-11" class="ftwp-heading" style="text-align: justify;">Đ&agrave;o tạo m&ocirc; h&igrave;nh</h4> <div id="urvanov-syntax-highlighter-610ff07e17bbd371779030" 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>init = tf.global_variables_initializer() iteration = 1500 with tf.Session() as sess: init.run() for iters in range(iteration): sess.run(training_op, feed_dict={X: X_batches, y: y_batches}) if iters % 150 == 0: mse = loss.eval(feed_dict={X: X_batches, y: y_batches}) print(iters, "\tMSE:", mse) y_pred = sess.run(outputs, feed_dict={X: X_test})</code></pre> </div> </div> <p style="text-align: justify;">B&agrave;i viết tiếp theo:&nbsp;<a href="../../apache-spark-machine-learning-voi-pyspark-va-mllib/" target="_blank" rel="noopener">Apache Spark &ndash; Machine learning với PySpark v&agrave; MLlib</a></p>