我正在使用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 回答
不要忘记LSTM用于处理时间序列或文本数据等序列 . 在序列中,元素的顺序非常重要,如果对元素重新排序,那么该序列的整个含义可能会完全改变 .
现在问题在于您使用的预处理步骤不适合LSTM模型 . 您将每个句子编码为向量,其中每个元素表示特定单词的存在或不存在 . 因此,您完全忽略了句子中单词出现的顺序,LSTM层擅长对其进行建模 . 考虑到您使用的预处理方案,LSTM模型中还存在另一个问题,即嵌入层接受单词索引作为输入而不是零和1的向量(即预处理阶段的输出) .
由于IMDB数据已经存储为单词索引序列,为了解决这个问题,您只需要通过填充/截断具有指定长度的序列来预处理IMDB数据,以便能够利用批处理 . 例如:
现在,
x_train
的形状为(25000, 500)
,它由25000个长度为500的序列组成,编码为整数字索引 . 现在,您可以通过将其传递给fit
方法来将其用于训练 . 我猜你可以通过嵌入层和单个LSTM层达到至少80%的训练精度 . 不要忘记使用验证方案来监视过度拟合(一个简单的选项是在调用fit
方法时设置validation_split
参数) .