【问题标题】:Keras-- low accuracy with LSTM layer but the accuracy is good without LSTMKeras——使用 LSTM 层精度低,但没有 LSTM 时精度很好
【发布时间】:2019-04-20 21:32:36
【问题描述】:

我正在使用 IMDB 数据集在 Keras 中训练一个模型。对于这个带有 LSTM 层的模型,准确率在 50% 左右:

 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

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

但是,如果我不使用 LSTM 层,准确率会达到 82% 左右

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'))

准确度:

 loss: 0.6738 - acc: 0.8214 - val_loss: 0.6250 - val_acc: 0.8320

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

model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc'])
model.fit(partial_x_train, partial_y_train, epochs=Numepochs, batch_size=Batchsize, validation_data=(x_val, y_val))

如何解释?我认为 LSTM 非常适合顺序文本数据?

【问题讨论】:

  • 输入数据如何编码(LSTM模型)?
  • 能否展示一下 LSTM 模型的数据加载和预处理阶段?
  • 实际上没有任何预处理(向量化序列除外),因为我使用的是 keras 中已经可用的默认 imdb 数据集。
  • 好的。你能解释或展示矢量化步骤吗?我想我知道出了什么问题,但我想确定一下。
  • 这是我正在使用的确切功能stackoverflow.com/questions/50213274/…

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


【解决方案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% 的训练准确率。不要忘记使用验证方案来监控过拟合(一个简单的选项是在调用fit 方法时设置validation_split 参数)。

【讨论】:

    猜你喜欢
    • 2018-04-17
    • 2020-02-11
    • 2019-01-28
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 2018-01-11
    • 1970-01-01
    • 2019-03-12
    相关资源
    最近更新 更多