keras 多层lstm_机器学习100天-Day2403 循环神经网络RNN(训练多层RNN)
說明:本文依據(jù)《Sklearn 與 TensorFlow 機器學習實用指南》完成,所有版權和解釋權均歸作者和翻譯成員所有,我只是搬運和做注解。
進入第二部分深度學習
第十四章循環(huán)神經(jīng)網(wǎng)絡
循環(huán)神經(jīng)網(wǎng)絡可以分析時間序列數(shù)據(jù),諸如股票價格,并告訴你什么時候買入和賣出。在自動駕駛系統(tǒng)中,他們可以預測行車軌跡,避免發(fā)生交通意外。
循環(huán)神經(jīng)網(wǎng)絡可以在任意長度的序列上工作,而不是之前討論的只能在固定長度的輸入上工作的網(wǎng)絡。
舉個例子,它們可以把語句,文件,以及語音范本作為輸入,使得它們在諸如自動翻譯,語音到文本或者情感分析(例如,讀取電影評論并提取評論者關于該電影的感覺)的自然語言處理系統(tǒng)中極為有用。
另外,循環(huán)神經(jīng)網(wǎng)絡的預測能力使得它們具備令人驚訝的創(chuàng)造力。
可以要求它們?nèi)ヮA測一段旋律的下幾個音符,隨機選取這些音符的其中之一并演奏它。然后要求網(wǎng)絡給出接下來最可能的音符,演奏它,如此周而復始。
同樣,循環(huán)神經(jīng)網(wǎng)絡可以生成語句,圖像標注等。
在本章中,教程介紹以下幾點
- 循環(huán)神經(jīng)網(wǎng)絡背后的基本概念
- 循環(huán)神經(jīng)網(wǎng)絡所面臨的主要問題(在第11章中討論的消失/爆炸的梯度),廣泛用于反抗這些問題的方法:LSTM 和 GRU cell(單元)。
- 展示如何用 TensorFlow 實現(xiàn)循環(huán)神經(jīng)網(wǎng)絡。最終我們將看看及其翻譯系統(tǒng)的架構。
5.構建多層RNN
我們在這里構建一個三層的RNN。
基本參數(shù)設定如下
n_steps = 28n_inputs = 28n_neurons = 100n_outputs = 10learning_rate = 0.001n_layers = 3構建三層,可以發(fā)現(xiàn)是使用for循環(huán),循環(huán)3次將之前一層的神經(jīng)網(wǎng)絡復制成三個壓入一個layers得list中。
layers = [tf.nn.rnn_cell.BasicRNNCell(num_units=n_neurons, activation=tf.nn.relu)for layer in range(n_layers)]然后使用tf.nn.rnn_cell.MultiRNNCell(layers)處理layers。
X = tf.placeholder(tf.float32, [None, n_steps, n_inputs])y = tf.placeholder(tf.int32, [None])# 原始一層的神經(jīng)網(wǎng)絡# basic_cell = tf.keras.layers.SimpleRNNCell(units=n_neurons)layers = [ tf.nn.rnn_cell.BasicRNNCell(num_units=n_neurons, activation=tf.nn.relu) for layer in range(n_layers)]# 這個地方應該也可以使用Keras,但是沒有查到multi_layer_cell = tf.nn.rnn_cell.MultiRNNCell(layers)outputs, states = tf.nn.dynamic_rnn(multi_layer_cell, X, dtype=tf.float32)# tf.concat是連接兩個矩陣的操作,其中values應該是一個tensor的list或者tuple。axis則是我們想要連接的維度。tf.concat返回的是連接后的tensor。states_concat = tf.concat(axis=1, values=states)logits = tf.layers.dense(states_concat, n_outputs)xentropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y, logits=logits)loss = tf.reduce_mean(xentropy)optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)training_op = optimizer.minimize(loss)correct = tf.nn.in_top_k(logits, y, 1)accuracy = tf.reduce_mean(tf.cast(correct, tf.float32))init = tf.global_variables_initializer()(X_train, y_train), (X_test, y_test) = tf.keras.datasets.mnist.load_data()X_train = X_train.astype(np.float32).reshape(-1, 28 * 28) / 255.0X_test = X_test.astype(np.float32).reshape(-1, 28 * 28) / 255.0y_train = y_train.astype(np.int32)y_test = y_test.astype(np.int32)X_valid, X_train = X_train[:5000], X_train[5000:]y_valid, y_train = y_train[:5000], y_train[5000:]def shuffle_batch(X, y, batch_size): rnd_idx = np.random.permutation(len(X)) n_batches = len(X) // batch_size for batch_idx in np.array_split(rnd_idx, n_batches): X_batch, y_batch = X[batch_idx], y[batch_idx] yield X_batch, y_batchX_test = X_test.reshape((-1, n_steps, n_inputs))n_epochs = 10batch_size = 150with tf.Session() as sess: init.run() for epoch in range(n_epochs): for X_batch, y_batch in shuffle_batch(X_train, y_train, batch_size): X_batch = X_batch.reshape((-1, n_steps, n_inputs)) sess.run(training_op, feed_dict={X: X_batch, y: y_batch}) acc_batch = accuracy.eval(feed_dict={X: X_batch, y: y_batch}) acc_test = accuracy.eval(feed_dict={X: X_test, y: y_test}) print(epoch, "Last batch accuracy:總結(jié)
以上是生活随笔為你收集整理的keras 多层lstm_机器学习100天-Day2403 循环神经网络RNN(训练多层RNN)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pandas中inplace_panda
- 下一篇: lisp语言画阿基米德线_中国油画艺术表