我正在使用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对于连续文本数据非常有用吗?
答案 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
参数)。