与 LSTM 中的 sigmoid + binary_crossentropy 相比,使用 softmax + categorical_crossentropy 获得更高的准确度

Posted

技术标签:

【中文标题】与 LSTM 中的 sigmoid + binary_crossentropy 相比,使用 softmax + categorical_crossentropy 获得更高的准确度【英文标题】:Getting higher accuracy with softmax + categorical_crossentropy compared to sigmoid + binary_crossentropy in LSTM 【发布时间】:2021-04-13 01:55:47 【问题描述】:

我正在使用 Word2Vec 编码和训练 LSTM 模型。我的数据只有两个标签和大约 10k 个具有 45k 个特征的实例。我的编码形状是 (58137, 100),我对其进行了训练。除了 softmax + categorical_crossentropy 和 sigmoid + binary_crossentropy 之外,我保持所有参数相同。由于我有两个标签,我应该使用 sigmoid + binary_crossentropy 获得更好的准确性?这是我的模型。

#model.add(Embedding(maximum_words_number, e_dim, input_length=X.shape[1]))
model.add(Embedding(58137, 100, weights = [embeddings] ,input_length=X_train.shape[1],trainable = False)) # -> This adds Word2Vec encodings
model.add(LSTM(10,return_sequences= True, dropout=0.2, recurrent_dropout=0.2))
model.add(LSTM(10,return_sequences= False, dropout=0.2, recurrent_dropout=0.2))
model.add(Dense(2, activation='softmax'))
#opt = SGD(lr=0.05)
model.compile(loss='categorical_crossentropy', optimizer="Nadam", metrics=['accuracy'])
epochs = 4
batch_size = 100
model_outcome = model.fit(X_train, y_train_binary, epochs=epochs, batch_size=batch_size,validation_split=0.2,callbacks=[EarlyStopping(monitor='val_loss', patience=1, min_delta=0.0001)])


model = Sequential()
#model.add(Embedding(maximum_words_number, e_dim, input_length=X.shape[1]))
model.add(Embedding(58137, 100, weights = [embeddings] ,input_length=X_train.shape[1],trainable = False)) # -> This adds Word2Vec encodings
model.add(LSTM(10,return_sequences= True, dropout=0.2, recurrent_dropout=0.2))
model.add(LSTM(10,return_sequences= False, dropout=0.2, recurrent_dropout=0.2))
model.add(Dense(2, activation='sigmoid'))
#opt = SGD(lr=0.05)
model.compile(loss='binary_crossentropy', optimizer="Nadam", metrics=['accuracy'])
epochs = 4
batch_size = 100
model_outcome = model.fit(X_train, y_train_binary, epochs=epochs, batch_size=batch_size,validation_split=0.2,callbacks=[EarlyStopping(monitor='val_loss', patience=1, min_delta=0.0001)])

第一个使用 softmax + categorical_crossentropy 的模型在测试集上的准确度和其他评估分数(精度、召回率和 f1)更高,有人能解释一下为什么会这样吗? 如果我创建的模型有问题,请告诉我。

谢谢。

【问题讨论】:

【参考方案1】:

准确度应该是相同的(或者考虑到您没有为精确的再现性设置种子,或者非常相似),但是在您的比较中,您在这一行犯了一个错误:

model.add(Dense(2, activation='sigmoid'))

这里,对于 binary_crossentropysigmoid,您需要 1 个而不是 2 个神经元。

因此,

model.add(Dense(1, activation='sigmoid'))

当然,您需要确保以正确的格式提供数据(sigmoid 和 BCE [0,1,1,1,...] 而不是 softmax + CCE [[0,1],[1,0],[1,0],[1,0],...]

【讨论】:

感谢您的快速回复先生,我会调查的。 不客气。我相信它会解决你的问题。

以上是关于与 LSTM 中的 sigmoid + binary_crossentropy 相比,使用 softmax + categorical_crossentropy 获得更高的准确度的主要内容,如果未能解决你的问题,请参考以下文章

lstm 128个神经元怎么理解

深度学习RNN | GRU | LSTM

Keras Lstm中dropout机制

Keras调用LSTM之函数接口介绍

算法基础知识(全连接层、LSTM、激励函数)

使用 Keras 编译 LSTM 时出现断言错误