是否可以使用 STATEFUL Recurrent NN (LSTM) 进行分类
Is it okay to use STATEFUL Recurrent NN (LSTM) for classification
我有一个数据集 C
50,000
(二进制)样本,每个 128
特征。 class 标签也是二进制的 1
或 -1
。例如,样本看起来像这样 [1,0,0,0,1,0, .... , 0,1] [-1]
。我的目标是 class 根据二进制 classes(即 1 或 -1)验证样本。我想尝试使用 Recurrent LSTM
为 classification 生成一个好的模型。为此,我使用 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 是否可以用于 classification 或者我这里的代码可能缺少某些东西或者它是错误的。请,我想知道代码是否有遗漏或错误以提高准确性。感谢任何帮助或建议。
当你只有一个输出单元时,你不能使用softmax
作为输出,因为它总是输出一个常数值1
。您需要将输出激活更改为 sigmoid
或将输出单元数设置为 2
并将损失设置为 categorical_crossentropy
。我会建议第一个选项。
我有一个数据集 C
50,000
(二进制)样本,每个 128
特征。 class 标签也是二进制的 1
或 -1
。例如,样本看起来像这样 [1,0,0,0,1,0, .... , 0,1] [-1]
。我的目标是 class 根据二进制 classes(即 1 或 -1)验证样本。我想尝试使用 Recurrent LSTM
为 classification 生成一个好的模型。为此,我使用 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 是否可以用于 classification 或者我这里的代码可能缺少某些东西或者它是错误的。请,我想知道代码是否有遗漏或错误以提高准确性。感谢任何帮助或建议。
当你只有一个输出单元时,你不能使用softmax
作为输出,因为它总是输出一个常数值1
。您需要将输出激活更改为 sigmoid
或将输出单元数设置为 2
并将损失设置为 categorical_crossentropy
。我会建议第一个选项。