Keras-LSTM层的精度较低,但没有LSTM的精度很高

时间:2018-11-18 08:34:30

标签: python machine-learning keras deep-learning lstm

我正在使用IMDB数据集在Keras中训练模型。对于带有LSTM层的模型,精度约为50%:

${Dir_Name}

准确性:

$1

我也尝试过使用单个LSTM层,但是它也提供了相似的准确性。

但是,如果我不使用LSTM层,则精度可以达到82%左右

 model = Sequential()
 model.add(Embedding(max_features, 32))
 model.add(LSTM(32, return_sequences=True))
 model.add(LSTM(32, return_sequences=True))
 model.add(LSTM(32))
 model.add(Dense(1, activation='sigmoid'))

准确性:

loss: 0.6933 - acc: 0.5007 - val_loss: 0.6932 - val_acc: 0.4947

这就是我编译和拟合模型的方式:

model = models.Sequential()
model.add(layers.Dense(16, kernel_regularizer=regularizers.l1(0.001), activation='relu', input_shape=(10000,)))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(16, kernel_regularizer=regularizers.l1(0.001), activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(1, activation='sigmoid'))

这怎么解释?我认为LSTM对于连续文本数据非常有用吗?

1 个答案:

答案 0 :(得分:1)

请不要忘记LSTM用于处理诸如时间序列或文本数据之类的序列。在一个序列中,元素的顺序非常重要,如果您对元素进行重新排序,则该序列的整体含义可能会完全改变。

现在,您遇到的问题是您使用的预处理步骤不适用于LSTM模型。您正在将每个句子编码为向量,其中每个元素表示特定单词的存在或不存在。因此,您完全可以忽略句子中单词出现的顺序,而LSTM层很适合对其建模。考虑到您使用的预处理方案,您的LSTM模型中还有另一个问题,那就是嵌入层接受单词索引作为输入,而不是零和一的向量(即预处理阶段的输出)的事实。

由于IMDB数据已经存储为单词索引序列,因此要解决此问题,您只需要通过填充/截断指定长度的序列来预处理IMDB数据即可使用批处理。例如:

from keras.preprocessing.sequences import pad_sequences

vocab_size = 10000 # only consider the 10000 most frequent words
(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=vocab_size)

x_train = pad_sequences(x_train, maxlen=500)  # truncate or pad sequences to make them all have a length of 500

现在,x_train的形状为(25000, 500),它由25000个长度为500的序列组成,被编码为整数单词索引。现在,您可以通过将其传递给fit方法来将其用于训练。我想通过嵌入层和单个LSTM层可以达到至少80%的训练精度。不要忘记使用验证方案来监视过度拟合(一个简单的选择是在调用validation_split方法时设置fit参数)。