Mes*_*zil 1 python machine-learning deep-learning lstm keras
我正在使用 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'))
Run Code Online (Sandbox Code Playgroud)
准确性:
loss: 0.6933 - acc: 0.5007 - val_loss: 0.6932 - val_acc: 0.4947
Run Code Online (Sandbox Code Playgroud)
我也尝试过使用单个 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'))
Run Code Online (Sandbox Code Playgroud)
准确性:
loss: 0.6738 - acc: 0.8214 - val_loss: 0.6250 - val_acc: 0.8320
Run Code Online (Sandbox Code Playgroud)
这就是我编译和拟合模型的方式:
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))
Run Code Online (Sandbox Code Playgroud)
这该如何解释呢?我认为 LSTM 对于顺序文本数据非常有效?
不要忘记 LSTM 用于处理序列,例如时间序列或文本数据。在序列中,元素的顺序非常重要,如果对元素重新排序,则该序列的整体含义可能会完全改变。
现在,您的情况的问题是您使用的预处理步骤不适合 LSTM 模型。您将每个句子编码为向量,其中每个元素代表特定单词的存在或不存在。因此,你完全忽略了句子中单词出现的顺序,而 LSTM 层擅长对其进行建模。考虑到您使用的预处理方案,您的 LSTM 模型中还存在另一个问题,即嵌入层接受单词索引作为输入,而不是由 0 和 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
Run Code Online (Sandbox Code Playgroud)
现在,x_train
它的形状为(25000, 500)
,由 25000 个长度为 500 的序列组成,编码为整数字索引。现在您可以通过将其传递给方法来将其用于训练fit
。我猜想使用嵌入层和单个 LSTM 层可以达到至少 80% 的训练准确率。不要忘记使用验证方案来监视过度拟合(一个简单的选项是validation_split
在调用fit
方法时设置参数)。
归档时间: |
|
查看次数: |
2895 次 |
最近记录: |