第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

全部開發(fā)者教程

TensorFlow 入門教程

首頁 慕課教程 TensorFlow 入門教程 TensorFlow 入門教程 在 TensorFlow 之中使用循環(huán)神經網絡

在 TensorFlow 之中使用循環(huán)神經網絡

在之前的學習之中,我們使用了全連接網絡、卷積神經網絡以及其他的網絡。今天我們要來學習另一種常用的神經?網絡 —— 循環(huán)神經網絡(RNN)。

1. 什么是循環(huán)神經網絡

循環(huán)神經網絡( recurrent neural network )簡稱 RNN 。顧名思義,這種網絡之中包含循環(huán)的結構,因此才被稱作循環(huán)神經網絡。

在我們之前學習過的網絡之中,網絡模型只是根據不同的樣本的輸入來進行處理,前面的輸入和后面的輸入互不相干,簡而言之,我們之前學習過的網絡模型不包含記憶性。而循環(huán)神經網絡( RNN )則可以具有記憶性,它能夠 “記住” 之前的輸入,從而對后面輸入的判別產生影響。

舉個簡單的例子,當我們在看電影的時候,如果用之前學過的模型來處理,就相當于一幀接著一幀地進行分析;而如果我們使用循環(huán)神經網絡來處理,就相當于將多個幀聯(lián)系起來處理。

因此我們可以得出結論,循環(huán)神經網絡更適合用來處理一些連續(xù)輸入的數(shù)據,比如文本、視頻、音頻等連續(xù)的數(shù)據。

既然想要使用循環(huán)神經網絡,我們便要簡單的了解一下循環(huán)神經網絡的基本結構。

循環(huán)神經網絡的基本結構如下圖所示:

圖片描述

我們可以看到,與之前學習過的網絡最大的不同就是該網絡含有一個循環(huán)結構,具體來說,循環(huán)神經網絡處理數(shù)據的基本過程為:

  • 輸入數(shù)據并處理;
  • 數(shù)據經過隱含狀態(tài)并得到兩個結果:
    • 這次輸入數(shù)據的輸出;
    • 隱含狀態(tài)的更新值。
  • 將數(shù)據輸出,同時更新隱含的狀態(tài)。

正是因為 RNN 可以根據不同的輸入來不斷地更新自己的隱含狀態(tài),因此我們才會說 RNN 具有 “記憶性”,也就是說,隱含狀態(tài)會 “記住之前地輸入狀態(tài)”。

在 RNN 的具體細節(jié)之中,涉及到許多的數(shù)學推導知識,我們在這里暫時不展開敘述,我們只需要學會如何使用循環(huán)神經網絡即可。而且在實際的應用之中,我們會采用多個單元的方式進行,從而提升網絡的容量。

2. 如何在 TensorFlow 之中使用循環(huán)神經網絡

在 TensorFlow 之中使用循環(huán)神經網絡也是一件非常容易的事情。但是值得注意的是,原生的循環(huán)神經網絡在 TensorFlow 之中的的實現(xiàn)比較復雜,而且通過訓練得到的效果也不是很好。因此,我們建議在 TensorFlow 之中使用 RNN 的一些變體,這些變體往往可以通過更少的工作量來獲取到更好的工作成果,在這里,我們使用 LSTM (長短期記憶)與 GRU (門循環(huán)單元)為例。這兩者的改變都涉及到比較底層的知識,大家不需要掌握,只需要知道這些變體能夠取得更好的效果并且學會如何使用即可。

最簡單的,我們可以通過使用以下 Keras 的 API 來進行長短期記憶(LSTM)的調用。

tf.keras.layers.LSTM(
    units, activation='tanh', recurrent_activation='sigmoid', 
    dropout=0.0, recurrent_dropout=0.0, return_sequences=False,
    return_state=False
)

其中的一些參數(shù)的意義如下:

  • units: 正整數(shù),輸出的維度;
  • activation: 要采用的激活函數(shù),一般保持默認 “tanh” 即可;
  • recurrent_activation: 在每次循環(huán)的時候要采用的激活函數(shù),默認為 “sigmoid”;
  • dropout:用來抑制過擬合的一種方法,被應用于輸入的階段;
  • recurrent_dropout:用來抑制過擬合的一種方法,被應用于循環(huán)的階段;
  • return_sequences:布爾值,是否返回一個完整的輸出序列,還是只返回最后一個輸出;
  • return_state:布爾值,是否返回中間的隱含狀態(tài)。

對于 GRU ,我們可以使用以下的 API 實現(xiàn)。

tf.keras.layers.GRU(
    units, activation='tanh', recurrent_activation='sigmoid', dropout=0.0,
    recurrent_dropout=0.0, return_sequences=False, return_state=False
)

可以看到 GRU 的 API 和 LSTM 的 API 的參數(shù)非常相似,而實際上他們的含義也相同。

  • units: 正整數(shù),GRU 輸出的維度;
  • activation: GRU 要采用的激活函數(shù),一般保持默認 “tanh” 即可;
  • recurrent_activation: GRU 在每次循環(huán)的時候要采用的激活函數(shù),默認為 “sigmoid”;
  • dropout:用來抑制過擬合的一種方法,被應用于 GRU 輸入的階段;
  • recurrent_dropout:用來抑制過擬合的一種方法,被應用于 GRU 循環(huán)的階段;
  • return_sequences:布爾值,定義 GRU 是否返回一個完整的輸出序列,還是只返回最后一個輸出;
  • return_state:布爾值,決定 GRU 是否返回中間的隱含狀態(tài)。

3. 在 TensorFlow 之中使用循環(huán)神經網絡的示例

這一小節(jié),我們將會使用一個具體的程序實例來演示如何在 TensorFlow 之中使用循環(huán)神經網絡,在這里,我們會使用 LSTM 舉例,大家也可以常使使用 GRU 等其他循環(huán)神經網絡。與往常一樣,我們仍然采用的是 IMDB 電影評價的數(shù)據集來進行演示。

在這里,我們具體的程序為:


import tensorflow as tf
import numpy as np

# 定義基本參數(shù)
words_num = 10000
val_num = 12500
EPOCHS = 10
pad_max_length = 256
BATCH_SIZE = 64

# 獲取數(shù)據
(train_data, train_labels), (test_data, test_labels) = tf.keras.datasets.imdb.load_data(num_words=words_num)
word_index = tf.keras.datasets.imdb.get_word_index()

# 添加特殊字符
word_index = {k:(v+3) for k,v in word_index.items()}
word_index["<pad>"] = 0
word_index["<start>"] = 1
word_index["<unknown>"] = 2
word_index["<unused>"] = 3

# 數(shù)據預處理
train_data = tf.keras.preprocessing.sequence.pad_sequences(train_data, value=0, padding='post', maxlen=pad_max_length)
test_data = tf.keras.preprocessing.sequence.pad_sequences(test_data, value=0, padding='post', maxlen=pad_max_length)

# 劃分訓練集合與驗證集合
x_val, x_train = train_data[:val_num], train_data[val_num:]
y_val, y_train = train_labels[:val_num], train_labels[val_num:]

# 模型構建
model = tf.keras.Sequential([
    tf.keras.layers.Embedding(words_num, 32),
    tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(64)),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dense(1, activation='sigmoid')
])

model.summary()

# 編譯模型
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

# 訓練
history = model.fit(x_train, y_train, epochs=EPOCHS,
          batch_size=BATCH_SIZE, validation_data=(x_val, y_val))

# 測試
results = model.evaluate(test_data, test_labels)

print(results)

可以看到,我們的代碼與之前的模型幾乎完全相同,只是我們的網絡模型采用了 LSTM(長短期記憶),大家可以將這次運行的結果與之前運行的結果相比較。

該處的代碼中,我們需要注意的一點是,我們將 LSTM 用 tf.keras.layers.Bidirectional () 這一網絡層包裹起來了。顧名思義,這一個雙向的網絡層,通過將 LSTM 使用該網絡層包裹,LSTM 不僅僅能夠學習到正向的信息,也能學習到反向的信息。舉個不恰當?shù)睦?,相當于人可以反著讀書一樣。這可以增強循環(huán)神經網絡提取信息的能力,童兒提升模型的效果。

最終,通過運行代碼,我們可以得到輸出:


_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
embedding_3 (Embedding)      (None, None, 32)          320000    
_________________________________________________________________
bidirectional_1 (Bidirection (None, 128)               49664     
_________________________________________________________________
dense_6 (Dense)              (None, 64)                8256      
_________________________________________________________________
dense_7 (Dense)              (None, 1)                 65        
=================================================================
Total params: 377,985
Trainable params: 377,985
Non-trainable params: 0
_________________________________________________________________
Epoch 1/10
196/196 [==============================] - 72s 369ms/step - loss: 0.5292 - accuracy: 0.7088 - val_loss: 0.3791 - val_accuracy: 0.8432
Epoch 2/10
196/196 [==============================] - 71s 360ms/step - loss: 0.2714 - accuracy: 0.8993 - val_loss: 0.3445 - val_accuracy: 0.8719
Epoch 3/10
196/196 [==============================] - 71s 363ms/step - loss: 0.1885 - accuracy: 0.9358 - val_loss: 0.3460 - val_accuracy: 0.8706
Epoch 4/10
196/196 [==============================] - 72s 365ms/step - loss: 0.1363 - accuracy: 0.9550 - val_loss: 0.3765 - val_accuracy: 0.8563
Epoch 5/10
196/196 [==============================] - 71s 363ms/step - loss: 0.0915 - accuracy: 0.9713 - val_loss: 0.4558 - val_accuracy: 0.8667
Epoch 6/10
196/196 [==============================] - 71s 362ms/step - loss: 0.0798 - accuracy: 0.9733 - val_loss: 0.7503 - val_accuracy: 0.8242
Epoch 7/10
196/196 [==============================] - 71s 363ms/step - loss: 0.0617 - accuracy: 0.9807 - val_loss: 0.5544 - val_accuracy: 0.8570
Epoch 8/10
196/196 [==============================] - 70s 359ms/step - loss: 0.0636 - accuracy: 0.9782 - val_loss: 0.5350 - val_accuracy: 0.7421
Epoch 9/10
196/196 [==============================] - 70s 357ms/step - loss: 0.0934 - accuracy: 0.9661 - val_loss: 0.6706 - val_accuracy: 0.8348
Epoch 10/10
196/196 [==============================] - 70s 356ms/step - loss: 0.0976 - accuracy: 0.9638 - val_loss: 0.5770 - val_accuracy: 0.8568
782/782 [==============================] - 34s 43ms/step - loss: 0.6340 - accuracy: 0.8440
[0.6339613795280457, 0.843999981880188]

可以看到,我們的網絡模型的準確率達到了 84% ,對于之前的網絡來說是一個不小的提升。

4. 總結

在這節(jié)課之中,我們學習了什么是循環(huán)神經網絡,并且詳細的了解了循環(huán)神經網絡在 TensorFlow 之中的使用方法。與此同時,我們使用了一個具體的網絡示例來展示了如何完整地使用 LSTM ,而這也達到了不錯的效果。

圖片描述