Tutorial RNN (Recurrent Neural Network): Contoh TensorFlow

Mengapa kita memerlukan Recurrent Neural Network (RNN)?

Jaringan Neural Berulang (RNN) memungkinkan Anda memodelkan unit memori untuk mempertahankan data dan memodelkan ketergantungan jangka pendek. Ini juga digunakan dalam peramalan deret waktu untuk mengidentifikasi korelasi dan pola data. Ini juga membantu menghasilkan hasil prediksi untuk data berurutan dengan memberikan perilaku serupa seperti otak manusia.

Struktur Jaringan Syaraf Tiruan relatif sederhana dan terutama tentang perkalian matriks. Pada langkah pertama, masukan dikalikan dengan bobot acak awalnya, dan bias, ditransformasikan dengan fungsi aktivasi dan nilai keluaran digunakan untuk membuat prediksi. Langkah ini memberikan gambaran seberapa jauh jarak jaringan dari kenyataan.

Metrik yang diterapkan adalah kerugian. Semakin tinggi fungsi kerugiannya, semakin bodoh modelnya. Untuk meningkatkan pengetahuan jaringan, diperlukan beberapa optimasi dengan mengatur bobot jaring. Penurunan gradien stokastik adalah metode yang digunakan untuk mengubah nilai bobot ke arah yang benar. Setelah penyesuaian dilakukan, jaringan dapat menggunakan kumpulan data lain untuk menguji pengetahuan barunya.

Untungnya, kesalahannya lebih rendah dari sebelumnya, namun tidak cukup kecil. Langkah optimasi dilakukan secara iteratif hingga error dapat diminimalkan, yakni tidak ada lagi informasi yang dapat diekstraksi.

Masalah dengan model jenis ini adalah tidak memiliki memori apa pun. Artinya input dan outputnya independen. Dengan kata lain, model tidak peduli dengan apa yang terjadi sebelumnya. Hal ini menimbulkan beberapa pertanyaan ketika Anda perlu memprediksi rangkaian waktu atau kalimat karena jaringan perlu memiliki informasi tentang data historis atau kata-kata masa lalu.

Untuk mengatasi masalah ini, jenis arsitektur baru telah dikembangkan: Jaringan Saraf Berulang (RNN)

Apa itu Jaringan Neural Berulang (RNN)?

A Jaringan Syaraf Berulang (RNN) adalah kelas dari Jaringan Saraf Buatan di mana hubungan antara node yang berbeda membentuk grafik terarah untuk memberikan perilaku dinamis temporal. Ini membantu untuk memodelkan data sekuensial yang berasal dari jaringan feedforward. Ia bekerja mirip dengan otak manusia untuk memberikan hasil prediksi.

Jaringan saraf berulang terlihat sangat mirip dengan jaringan saraf tradisional hanya saja keadaan memori ditambahkan ke neuron. Perhitungan untuk memasukkan memori itu sederhana.

Bayangkan sebuah model sederhana dengan hanya satu neuron yang diumpankan oleh sekumpulan data. Dalam jaringan saraf tradisional, model menghasilkan keluaran dengan mengalikan masukan dengan bobot dan fungsi aktivasi. Dengan RNN, keluaran ini dikirim kembali ke dirinya sendiri dalam jangka waktu tertentu. Kami memanggil langkah waktu lamanya waktu keluaran menjadi masukan perkalian matriks berikutnya.

Misalnya pada gambar di bawah, Anda dapat melihat jaringan terdiri dari satu neuron. Jaringan menghitung perkalian matriks antara input dan bobot dan menambahkan non-linearitas dengan fungsi aktivasi. Ini menjadi output pada t-1. Output ini merupakan input dari perkalian matriks kedua.

Jaringan Syaraf Berulang (RNN)
Jaringan Syaraf Berulang (RNN)

Di bawah ini, kami mengkodekan RNN sederhana di TensorFlow untuk memahami langkah dan juga bentuk outputnya.

Jaringan ini terdiri dari:

  • Empat input
  • Enam neuron
  • langkah 2 kali

Jaringan akan berjalan seperti yang digambarkan pada gambar di bawah ini.

Jaringan Syaraf Berulang (RNN)

Jaringan ini disebut 'berulang' karena melakukan operasi yang sama di setiap kotak aktivasi. Jaringan menghitung bobot masukan dan keluaran sebelumnya untuk menggunakan fungsi aktivasi.

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
    ])

Kita dapat membangun jaringan dengan placeholder untuk data, tahapan berulang, dan keluaran.

  1. Tentukan placeholder untuk data tersebut
X = tf.placeholder(tf.float32, [None, n_timesteps, n_inputs])

Sini:

  • Tidak ada: Tidak diketahui dan akan sesuai dengan ukuran batch
  • n_timesteps: Berapa kali jaringan mengirim output kembali ke neuron
  • n_inputs: Jumlah input per batch
  1. Tentukan jaringan berulang

Seperti disebutkan pada gambar di atas, jaringan terdiri dari 6 neuron. Jaringan akan menghitung produk dua titik:

  • Masukkan data dengan kumpulan bobot pertama (yaitu 6: sama dengan jumlah neuron)
  • Keluaran sebelumnya dengan rangkaian bobot kedua (yaitu, 6: sesuai dengan jumlah keluaran)

Perhatikan bahwa, selama feedforward pertama, nilai output sebelumnya sama dengan nol karena kita tidak memiliki nilai apa pun.

Objek untuk membangun RNN adalah tf.contrib.rnn.BasicRNNCell dengan argumen num_units untuk menentukan jumlah input

basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=n_neurons)

Sekarang setelah jaringan ditentukan, Anda dapat menghitung keluaran dan statusnya

outputs, states = tf.nn.dynamic_rnn(basic_cell, X, dtype=tf.float32)

Objek ini menggunakan loop internal untuk mengalikan matriks beberapa kali.

Perhatikan bahwa neuron berulang adalah fungsi dari semua masukan dari langkah waktu sebelumnya. Beginilah cara jaringan membangun memorinya sendiri. Informasi dari masa lalu dapat disebarkan di masa mendatang. Inilah keajaiban jaringan saraf berulang

## 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]]

Untuk tujuan penjelasan, Anda mencetak nilai keadaan sebelumnya. Output yang dicetak di atas menunjukkan output dari keadaan terakhir. Sekarang cetak semua keluaran, Anda dapat melihat statusnya adalah keluaran sebelumnya dari setiap batch. Artinya, keluaran sebelumnya berisi informasi tentang keseluruhan rangkaian.e

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)

Jaringan Syaraf Berulang (RNN)

Outputnya berbentuk (3, 2, 6):

  • 3: Jumlah batch
  • 2: Jumlah langkah waktu
  • 6: Jumlah neuron

Optimalisasi jaringan saraf berulang identik dengan jaringan saraf tradisional. Anda akan melihat lebih detail cara melakukan optimasi kode di bagian selanjutnya dari tutorial Jaringan Neural Berulang ini.

Aplikasi RNN

RNN memiliki banyak kegunaan, terutama dalam memprediksi masa depan. Dalam industri keuangan, RNN dapat membantu dalam memprediksi harga saham atau tanda arah pasar saham (positif atau negatif).

RNN berguna untuk mobil otonom karena dapat menghindari kecelakaan mobil dengan mengantisipasi lintasan kendaraan.

RNN banyak digunakan dalam analisis teks, pembuatan teks gambar, analisis sentimen, dan terjemahan mesin. Misalnya, seseorang dapat menggunakan review film untuk memahami perasaan penonton setelah menonton film tersebut. Mengotomatiskan tugas ini sangat berguna ketika perusahaan film tidak memiliki cukup waktu untuk meninjau, memberi label, mengkonsolidasikan, dan menganalisis ulasan. Mesin dapat melakukan pekerjaan dengan tingkat akurasi yang lebih tinggi.

Keterbatasan RNN

Secara teori, RNN seharusnya membawa informasi terkini. Namun, cukup sulit untuk menyebarkan semua informasi ini jika jangka waktunya terlalu lama. Ketika suatu jaringan memiliki terlalu banyak lapisan dalam, jaringan tersebut menjadi tidak dapat dilatih. Masalah ini disebut: masalah gradien menghilang. Jika Anda ingat, jaringan saraf memperbarui bobot menggunakan algoritma penurunan gradien. Gradien semakin mengecil ketika jaringan turun ke lapisan yang lebih rendah.

Kesimpulannya, gradiennya tetap konstan, artinya tidak ada ruang untuk perbaikan. Model belajar dari perubahan gradien; perubahan ini mempengaruhi keluaran jaringan. Akan tetapi, jika perbedaan gradiennya terlalu kecil (yaitu bobotnya sedikit berubah), jaringan tidak dapat mempelajari apa pun sehingga menghasilkan output. Oleh karena itu, jaringan yang menghadapi masalah gradien hilang tidak dapat berkumpul menuju solusi yang baik.

Peningkatan LSTM

Untuk mengatasi potensi masalah hilangnya gradien yang dihadapi oleh RNN, tiga peneliti, Hochreiter, Schmidhuber, dan Bengio menyempurnakan RNN dengan arsitektur yang disebut Long Short-Term Memory (LSTM). Singkatnya, LSMT menyediakan informasi masa lalu yang relevan ke masa kini ke jaringan. Mesin menggunakan arsitektur yang lebih baik untuk memilih dan membawa informasi kembali ke masa mendatang.

Arsitektur LSTM tersedia di TensorFlow, tf.contrib.rnn.LSTMCell. LSTM berada di luar cakupan tutorial. Anda dapat merujuk ke situs resmi dokumentasi untuk informasi lebih lanjut

RNN dalam deret waktu

Dalam tutorial TensorFlow RNN ini, Anda akan menggunakan RNN dengan data deret waktu. Deret waktu bergantung pada waktu sebelumnya yang berarti nilai masa lalu mencakup informasi relevan yang dapat dipelajari oleh jaringan. Ide di balik prediksi deret waktu adalah untuk memperkirakan nilai masa depan dari suatu deret, misalnya harga saham, suhu, PDB, dan sebagainya.

Persiapan data untuk Keras RNN dan deret waktu bisa jadi sedikit rumit. Pertama-tama, tujuannya adalah untuk memprediksi nilai deret berikutnya, artinya, Anda akan menggunakan informasi masa lalu untuk memperkirakan nilai pada t + 1. Labelnya sama dengan barisan masukan dan bergeser satu periode ke depan. Kedua, jumlah input diatur ke 1, yaitu satu observasi per waktu. Terakhir, langkah waktu sama dengan urutan nilai numerik. Misalnya, jika Anda mengatur langkah waktu ke 10, urutan input akan kembali sepuluh kali berturut-turut.

Perhatikan grafik di bawah ini, kita telah merepresentasikan data deret waktu di sebelah kiri dan deret masukan fiktif di sebelah kanan. Anda membuat fungsi untuk mengembalikan kumpulan data dengan nilai acak untuk setiap hari dari Januari 2001 hingga Desember 2016

# 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)

Keluaran

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
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()

RNN dalam Rangkaian Waktu

Bagian kanan grafik menunjukkan semua rangkaian. Ini dimulai dari tahun 2001 dan berakhir pada tahun 2019. Tidak masuk akal untuk memasukkan semua data di jaringan, sebagai gantinya, Anda perlu membuat kumpulan data dengan panjang yang sama dengan langkah waktu. Batch ini akan menjadi variabel X. Variabel Y sama dengan X tetapi digeser satu periode (yaitu, Anda ingin memperkirakan t+1).

Kedua vektor mempunyai panjang yang sama. Anda dapat melihatnya di bagian kanan grafik di atas. Garis mewakili sepuluh nilai masukan X, sedangkan titik merah adalah sepuluh nilai label, Y. Perhatikan bahwa, label dimulai satu periode sebelum X dan berakhir satu periode setelahnya.

Buat RNN untuk memprediksi Rangkaian Waktu di TensorFlow

Nah pada pelatihan RNN kali ini saatnya membangun RNN pertama Anda untuk memprediksi rangkaian di atas. Anda perlu menentukan beberapa hyperparameter (parameter model, yaitu jumlah neuron, dll.) untuk model:

  • Jumlah masukan: 1
  • Langkah waktu (jendela dalam deret waktu): 10
  • Jumlah neuron: 120
  • Jumlah keluaran: 1

Jaringan Anda akan belajar dari urutan 10 hari dan berisi 120 neuron berulang. Anda memberi makan model dengan satu masukan, yaitu suatu hari. Jangan ragu untuk mengubah nilainya untuk melihat apakah modelnya membaik.

Sebelum membuat model, Anda perlu membagi kumpulan data menjadi kumpulan pelatihan dan kumpulan pengujian. Kumpulan data lengkap memiliki 222 titik data; Anda akan menggunakan 201 poin pertama untuk melatih model dan 21 poin terakhir untuk menguji model Anda.

Setelah Anda menentukan rangkaian pelatihan dan pengujian, Anda perlu membuat objek yang berisi batch. Dalam kumpulan ini, Anda memiliki nilai X dan nilai Y. Ingatlah bahwa nilai X tertinggal satu periode. Oleh karena itu, Anda menggunakan 200 observasi pertama dan langkah waktunya sama dengan 10. Objek X_batches harus berisi 20 batch berukuran 10*1. y_batches memiliki bentuk yang sama dengan objek X_batches tetapi dengan satu titik di depannya.

Langkah 1) Buat kereta dan uji

Pertama-tama, Anda mengubah deret tersebut menjadi a mati rasa array; lalu Anda menentukan jendelanya (yaitu, jumlah waktu jaringan akan belajar), jumlah masukan, keluaran, dan ukuran rangkaian kereta seperti ditunjukkan dalam contoh TensorFlow RNN di bawah ini.

series = np.array(ts)
n_windows = 20   
n_input =  1
n_output = 1
size_train = 201

Setelah itu, Anda cukup membagi array menjadi dua dataset.

## Split data
train = series[:size_train]
test = series[size_train:]
print(train.shape, test.shape)
(201,) (21,)

Langkah 2) Buat fungsi untuk mengembalikan X_batches dan y_batches

Untuk mempermudahnya, Anda bisa membuat fungsi yang mengembalikan dua array berbeda, satu untuk X_batches dan satu lagi untuk y_batches.

Mari kita tulis fungsi RNN TensorFlow untuk membuat batch.

Perhatikan bahwa, batch X tertinggal satu periode (kita ambil nilai t-1). Output fungsi tersebut harus memiliki tiga dimensi. Dimensi pertama sama dengan jumlah batch, dimensi kedua sama dengan ukuran jendela, dan dimensi terakhir sama dengan jumlah input.

Bagian tersulitnya adalah memilih titik data dengan benar. Untuk titik data X, Anda memilih observasi dari t = 1 hingga t =200, sedangkan untuk titik data Y, Anda mengembalikan observasi dari t = 2 hingga 201. Setelah Anda memiliki titik data yang benar, Anda dapat dengan mudah membentuknya kembali seri.

Untuk membuat objek dengan batch, Anda perlu membagi kumpulan data menjadi sepuluh batch dengan panjang yang sama (yaitu 20). Anda dapat menggunakan metode pembentukan ulang dan meneruskan -1 agar rangkaiannya serupa dengan ukuran batch. Nilai 20 adalah jumlah observasi per batch dan 1 adalah jumlah input.

Anda perlu melakukan langkah yang sama tetapi untuk labelnya.

Perhatikan bahwa, Anda perlu menggeser data ke berapa kali Anda ingin memperkirakan. Misalnya, jika Anda ingin memprediksi satu waktu ke depan, geser rangkaiannya sebanyak 1. Jika Anda ingin memperkirakan dua hari, geser datanya sebanyak 2.

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

Sekarang fungsinya sudah ditentukan, Anda dapat memanggilnya untuk membuat batch seperti yang ditunjukkan pada contoh RNN di bawah.

X_batches, y_batches = create_batches(df = train,
                                      windows = n_windows,
                                      input = n_input,
                                      output = n_output)

Anda dapat mencetak bentuknya untuk memastikan dimensinya benar.

print(X_batches.shape, y_batches.shape)
(10, 20, 1) (10, 20, 1)

Anda perlu membuat set pengujian hanya dengan satu kumpulan data dan 20 observasi.

Perhatikan bahwa, Anda memperkirakan hari demi hari, artinya nilai prediksi kedua akan didasarkan pada nilai sebenarnya pada hari pertama (t+1) dari kumpulan data pengujian. Faktanya, nilai sebenarnya akan diketahui.

Jika Anda ingin memperkirakan t+2 (yaitu, dua hari ke depan), Anda perlu menggunakan nilai prediksi t+1; jika Anda ingin memprediksi t+3 (tiga hari ke depan), Anda perlu menggunakan nilai prediksi t+1 dan t+2. Masuk akal bahwa sulit untuk memprediksi secara akurat beberapa hari ke depan.

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)

Baiklah, ukuran batch Anda sudah siap, Anda dapat membangun arsitektur RNN. Ingat, Anda memiliki 120 neuron berulang.

Langkah 3) Bangun model

Untuk membuat model, Anda perlu mendefinisikan tiga bagian:

  1. Variabel dengan tensor
  2. RNN
  3. Kerugian dan optimalisasi

Langkah 3.1) Variabel

Anda perlu menentukan variabel X dan y dengan bentuk yang sesuai. Langkah ini sepele. Tensor memiliki dimensi yang sama dengan objek X_batches dan y_batches.

Misalnya, tensor X adalah placeholder (Lihat tutorial Pengenalan aliran tensor untuk menyegarkan pikiran Anda tentang deklarasi variabel) memiliki tiga dimensi:

  • Catatan: ukuran batch
  • n_windows: Panjang jendela. Yaitu, berapa kali model melihat ke belakang
  • n_input: Jumlah masukan

Hasilnya adalah:

tf.placeholder(tf.float32, [None, n_windows, n_input])
## 1. Construct the tensors
X = tf.placeholder(tf.float32, [None, n_windows, n_input])   
y = tf.placeholder(tf.float32, [None, n_windows, n_output])

Langkah 3.2) Buat RNNnya

Pada bagian kedua contoh RNN TensorFlow ini, Anda perlu menentukan arsitektur jaringan. Seperti sebelumnya, Anda menggunakan objek BasicRNNCell dan dynamic_rnn dari estimator TensorFlow.

## 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)   

Bagian selanjutnya sedikit lebih rumit tetapi memungkinkan komputasi lebih cepat. Anda perlu mengubah keluaran proses menjadi lapisan padat dan kemudian mengonversinya lagi agar memiliki dimensi yang sama dengan masukan.

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])  

Langkah 3.3) Buat kerugian dan optimasi

Pengoptimalan model bergantung pada tugas yang Anda lakukan. Pada tutorial sebelumnya tentang CNN, tujuan Anda adalah mengklasifikasikan gambar, dalam tutorial RNN ini tujuannya sedikit berbeda. Anda diminta membuat prediksi pada variabel kontinu dibandingkan dengan suatu kelas.

Perbedaan ini penting karena akan mengubah masalah optimasi. Masalah optimasi untuk variabel kontinu adalah meminimalkan mean square error. Untuk membuat metrik ini di TF, Anda dapat menggunakan:

  • tf.reduce_sum(tf.square(output – y))

Sisa kode RNN sama seperti sebelumnya; Anda menggunakan pengoptimal Adam untuk mengurangi kerugian (yaitu, MSE):

  • tf.train.AdamOptimizer(tingkat_belajar=tingkat_belajar)
  • pengoptimal.minimalkan (kerugian)

Selesai, Anda dapat mengemas semuanya, dan model Anda siap untuk dilatih.

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() 

Anda akan melatih model menggunakan 1500 epoch dan mencetak kerugian setiap 150 iterasi. Setelah model dilatih, Anda mengevaluasi model pada set pengujian dan membuat objek yang berisi prediksi seperti yang ditunjukkan pada contoh Jaringan Neural Berulang di bawah ini.

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

Terakhir dalam tutorial Pembelajaran Mendalam RNN ini, Anda dapat memplot nilai sebenarnya dari rangkaian tersebut dengan nilai prediksi. Jika model Anda diperbaiki, nilai prediksi harus ditempatkan di atas nilai sebenarnya.

Seperti yang Anda lihat, model ini masih bisa ditingkatkan. Terserah Anda untuk mengubah hiperparameter seperti jendela, ukuran batch dari jumlah neuron berulang.

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()
Prakiraan vs Aktual

Prakiraan vs Aktual

Ringkasan

Jaringan saraf berulang adalah arsitektur yang tangguh untuk menangani deret waktu atau analisis teks. Keluaran dari status sebelumnya adalah umpan balik untuk mempertahankan memori jaringan dari waktu ke waktu atau rangkaian kata.

Di TensorFlow, Anda dapat menggunakan kode berikut untuk melatih Jaringan Neural Berulang TensorFlow untuk deret waktu:

Parameter model

n_windows = 20   
n_input =  1
n_output = 1
size_train = 201

Tentukan modelnya

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])

Bangun optimasi

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)                                          

Latih modelnya

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})