【509】NLP实战系列(九)—— 结合 CNN 和 RNN 来处理长序列

  一维 CNN 分别处理每个输入序列段,所以它对时间步的顺序不敏感(这里所说的顺序的范围要大于局部尺度,即大于卷积窗口的大小),这一点与 RNN 不同。

  要想结合 CNN 的速度和轻量与 RNN 的顺序敏感性,一种方法是在 RNN 前面使用一维 CNN 作为预处理步骤。对于那些非常长,以至于 RNN 无法处理的序列(比如包含上千个时间步的序列),这种方法尤为有用。CNN 可以将长的输入序列转换为高级特征组成的更短序列(下采样)。然后,提取的特征组成的这些序列成为网络中的 RNN 的输入。

举例

from keras.models import Sequential
from keras import layers
from keras.optimizers import RMSprop

model = Sequential()
model.add(layers.Embedding(max_features, 128, input_length=max_len))
model.add(layers.Conv1D(32, 7, activation='relu'))
model.add(layers.MaxPooling1D(5))
model.add(layers.Conv1D(32, 7, activation='relu'))
model.add(layers.LSTM(32))
model.add(layers.Dense(1))

model.summary()

model.compile(optimizer=RMSprop(lr=1e-4),
              loss='binary_crossentropy',
              metrics=['acc'])
history = model.fit(x_train, y_train,
                    epochs=5,
                    batch_size=128,
                    validation_split=0.2)

  

原文地址:https://www.cnblogs.com/alex-bn-lee/p/14200838.html