【问题标题】:Is it okay to use STATEFUL Recurrent NN (LSTM) for classification可以使用STATEFUL Recurrent NN (LSTM) 进行分类吗
【发布时间】:2018-04-24 19:04:40
【问题描述】:

我有一个 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 是否可以用于分类,或者我的代码可能缺少某些内容或错误。好心,我想知道代码是否有遗漏或错误以提高准确性。任何帮助或建议表示赞赏。

【问题讨论】:

    标签: machine-learning keras classification lstm recurrent-neural-network


    【解决方案1】:

    当您只有一个输出单元时,您不能将softmax 用作输出,因为它始终会为您输出恒定值1。您需要将输出激活更改为sigmoid,或将输出单元编号设置为2,并将损失设置为categorical_crossentropy。我会建议第一个选项。

    【讨论】:

    • 感谢您的回复。非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 2019-06-24
    • 2019-09-05
    • 2014-02-09
    相关资源
    最近更新 更多