作者: fchollet
创建日期: 2020/05/03
最后修改: 2020/05/03
描述: 在 IMDB 电影评论情感分类数据集上训练一个 2 层双向 LSTM。
import numpy as np
import keras
from keras import layers
max_features = 20000 # 仅考虑前 20k 个单词
maxlen = 200 # 仅考虑每个电影评论的前 200 个单词
# 处理变长整数序列的输入
inputs = keras.Input(shape=(None,), dtype="int32")
# 将每个整数嵌入到一个 128 维的向量中
x = layers.Embedding(max_features, 128)(inputs)
# 添加 2 个双向 LSTM
x = layers.Bidirectional(layers.LSTM(64, return_sequences=True))(x)
x = layers.Bidirectional(layers.LSTM(64))(x)
# 添加分类器
outputs = layers.Dense(1, activation="sigmoid")(x)
model = keras.Model(inputs, outputs)
model.summary()
Model: "functional_1"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┓ ┃ 层 (类型) ┃ 输出形状 ┃ 参数 # ┃ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━┩ │ input_layer (InputLayer) │ (None, None) │ 0 │ ├─────────────────────────────────┼───────────────────────────┼────────────┤ │ embedding (Embedding) │ (None, None, 128) │ 2,560,000 │ ├─────────────────────────────────┼───────────────────────────┼────────────┤ │ bidirectional (Bidirectional) │ (None, None, 128) │ 98,816 │ ├─────────────────────────────────┼───────────────────────────┼────────────┤ │ bidirectional_1 (Bidirectional) │ (None, 128) │ 98,816 │ ├─────────────────────────────────┼───────────────────────────┼────────────┤ │ dense (Dense) │ (None, 1) │ 129 │ └─────────────────────────────────┴───────────────────────────┴────────────┘
总参数: 2,757,761 (10.52 MB)
可训练参数: 2,757,761 (10.52 MB)
不可训练的参数: 0 (0.00 B)
(x_train, y_train), (x_val, y_val) = keras.datasets.imdb.load_data(
num_words=max_features
)
print(len(x_train), "训练序列")
print(len(x_val), "验证序列")
# 使用pad_sequence标准化序列长度:
# 这将截断超过200个单词的序列并对少于200个单词的序列进行零填充。
x_train = keras.utils.pad_sequences(x_train, maxlen=maxlen)
x_val = keras.utils.pad_sequences(x_val, maxlen=maxlen)
正在从 https://storage.googleapis.com/tensorflow/tf-keras-datasets/imdb.npz 下载数据
17464789/17464789 ━━━━━━━━━━━━━━━━━━━━ 0s 0us/step
25000 训练序列
25000 验证序列
您可以使用托管在 Hugging Face Hub 上的训练模型,并在 Hugging Face Spaces 上尝试演示。
model.compile(optimizer="adam", loss="binary_crossentropy", metrics=["accuracy"])
model.fit(x_train, y_train, batch_size=32, epochs=2, validation_data=(x_val, y_val))
第1轮/共2轮
782/782 ━━━━━━━━━━━━━━━━━━━━ 61s 75ms/step - accuracy: 0.7540 - loss: 0.4697 - val_accuracy: 0.8269 - val_loss: 0.4202
第2轮/共2轮
782/782 ━━━━━━━━━━━━━━━━━━━━ 54s 69ms/step - accuracy: 0.9151 - loss: 0.2263 - val_accuracy: 0.8428 - val_loss: 0.3650
<keras.src.callbacks.history.History at 0x7f3efd663850>