本教程的目的是帶領大家學會用 RNN 進行文本分類
本次用到的資料集是 IMDB,一共有 50000 條電影評論,其中 25000 條是訓練集,另外 25000 條是測試集
首先我們需要加載資料集,可以通過 TFDS 很簡單的把資料集下載下傳過來,如下代碼所示
dataset, info = tfds.load('imdb_reviews', with_info=True, as_supervised=True)
train_dataset, test_dataset = dataset['train'], dataset['test']
train_dataset.element_spec
接下來我們需要建立 text encoder,可以通過 tf.keras.layers.experimental.preprocessing.TextVectorization 實作,如下代碼所示
VOCAB_SIZE = 1000
encoder = tf.keras.layers.experimental.preprocessing.TextVectorization(
max_tokens=VOCAB_SIZE
)
encoder.adapt(train_dataset.map(lambda text, label: text))
接下來我們需要搭模組化型,下圖是模型結構圖
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuEDM1UDMyIjM3ATMyAjMvwVMh5WaoNWZk92YvwVbvNmLzNmb1lXasFmLlRXYyVGblN2Yh1ycz9mL2kTOx4Wa45WYph3bh12Lc9CX6MHc0RHaiojIsJye.png)
對應的代碼如下所示
model = tf.keras.Sequential([
encoder,
tf.keras.layers.Embedding(
input_dim=len(encoder.get_vocabulary()),
output_dim=64,
# Use masking to handle the variable sequence lengths
mask_zero=True),
tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(64)),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dense(1)
])
model.compile(loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
optimizer=tf.keras.optimizers.Adam(1e-4),
metrics=['accuracy'])
到這一步,我們就可以開始訓練了,以及訓練後進行模型評估
history = model.fit(train_dataset, epochs=10,
validation_data=test_dataset,
validation_steps=30)
test_loss, test_acc = model.evaluate(test_dataset)
print('Test Loss:', test_loss)
print('Test Accuracy:', test_acc)
上面是訓練的結果記錄圖
代碼位址:
https://codechina.csdn.net/csdn_codechina/enterprise_technology/-/blob/master/text_classification_rnn.ipynb