首页 文章

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

提问于
浏览
0

我正在使用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适用于顺序文本数据?

1 回答

  • 1

    不要忘记LSTM用于处理时间序列或文本数据等序列 . 在序列中,元素的顺序非常重要,如果对元素重新排序,那么该序列的整个含义可能会完全改变 .

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

    由于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 参数) .

相关问题