首页 文章

是否可以使用STATEFUL Recurrent NN(LSTM)进行分类

提问于
浏览
1

我有一个数据集 C 50,000 (二进制)样本 128 每个 . 类标签也是二进制 1-1 . 例如,样本看起来像这样 [1,0,0,0,1,0, .... , 0,1] [-1] . 我的目标是根据二进制类(即1或-1)对样本进行分类 . 我想尝试使用Recurrent LSTM 来生成一个好的分类模型 . 为此,我使用 Keras 库编写了以下代码:

tr_C, ts_C, tr_r, ts_r = train_test_split(C, r, train_size=.8)
batch_size = 200

print('>>> Build STATEFUL model...')
model = Sequential()
model.add(LSTM(128, batch_input_shape=(batch_size, C.shape[1], C.shape[2]), return_sequences=False, stateful=True))
model.add(Dense(1, activation='softmax'))

print('>>> Training...')
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(tr_C, tr_r,
          batch_size=batch_size, epochs=1, shuffle=True,
          validation_data=(ts_C, ts_r))

但是,我的准确率不高,不超过55% . 我试图改变激活功能以及损失功能,希望提高准确性,但没有任何作用 . 令人惊讶的是,当我使用多层感知器时,我的准确率非常高,约为97% . 因此,我开始质疑LSTM是否可以用于分类,或者我的代码可能缺少某些东西或者它是错误的 . 请注意,我想知道代码是否缺少或错误以提高准确性 . 任何帮助或建议表示赞赏 .

1 回答

  • 1

    当您只有一个输出单位时,不能使用 softmax 作为输出,因为它总是输出一个常量值 1 . 您需要将输出激活更改为 sigmoid 或将输出单位数设置为 2 并将损失设置为 categorical_crossentropy . 我会建议第一个选择 .

相关问题