循环神经网络(RNN,recurrent neural network):它处理序列的方式是,遍历所有序列元素,并保存一个状态(state),其中包含与已查看内容相关的信息。总之, RNN 是一个 for 循环,它重复使用循环前一次迭代的计算结果
将这个模型应用于 IMDB 电影评论分类问题,首先进行预处理。
from keras.datasets import imdb
from keras.preprocessing import sequence
max_features = 10000
maxlen = 500
batch_size = 32
print('Loading data...')
(input_train, y_train), (input_test, y_test) = imdb.load_data(
num_words=max_features)
print(len(input_train), 'train sequences')
print(len(input_test), 'test sequences')
print('Pad sequences (samples x time)')
input_train = sequence.pad_sequences(input_train, maxlen=maxlen)
input_test = sequence.pad_sequences(input_test, maxlen=maxlen)
print('input_train shape:', input_train.shape)
print('input_test shape:', input_test.shape)
#用 Embedding 层和 SimpleRNN 层来训练模型
from keras.layers import Dense
model = Sequential()
model.add(Embedding(max_features, 32))
model.add(SimpleRNN(32))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc'])
history = model.fit(input_train, y_train,
epochs=10,
batch_size=128,
validation_split=0.2)
#绘制结果
%matplotlib inline
import matplotlib.pyplot as plt
acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(1, len(acc) + 1)
plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
plt.legend()

plt.figure()
plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.legend()
plt.show()
相比之前简单方法得到的88的精度,这次的的验证精度大约只有85,一方面是这个小型循环网络表现不好,另一方面输入只考虑了前500个单词,同时SimpleRNN并不擅长处理如文本这样的长序列。
SimpleRNN 并不是 Keras 中唯一可用的循环层,SimpleRNN 通常过于简化,没有实用价值。SimpleRNN 的最大问题是,在时刻 t ,理论上来说,它应该能够记住许多时间步之前见过的信息,但实际上它是不可能学到这种长期依赖的。其原因在于梯度消失问题。
LSTM 层是 SimpleRNN 层的一种变体,它增加了一种携带信息跨越多个时间步的方法。它在长序列上的效果要好于普通 RNN。
#使用 Keras 中的 LSTM 层
from keras.layers import LSTM
model = Sequential()
model.add(Embedding(max_features, 32))
model.add(LSTM(32))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['acc'])
history = model.fit(input_train, y_train,
epochs=10,
batch_size=128,
validation_split=0.2)
精确度:

损失值:

精确值达到将近89,比 SimpleRNN 网络好多了,这主要是因为LSTM 受梯度消失问题的影响要小得多。这个结果也比第 3 章的全连接网络略好,尽管使用的数据量比它少。更加困难的自然语言处理问题,特别是问答和机器翻译,这时 LSTM 的优势就明显了。
本文探讨了循环神经网络(RNN)在处理序列数据时的工作原理,特别是在IMDB电影评论分类任务中的应用。通过比较SimpleRNN和LSTM层,发现LSTM在解决梯度消失问题上更有效,从而在验证精度上优于SimpleRNN,达到将近89%。对于更复杂的自然语言处理任务,LSTM展现出了更强的优势。
&spm=1001.2101.3001.5002&articleId=86603527&d=1&t=3&u=075b7399c0ff441a800617a7914ce680)
4834

被折叠的 条评论
为什么被折叠?



