我正在使用Word2Verc编码和训练LSTM模型。我的数据只有两个标签和大约1万个具有45k功能的实例。我的编码的形状是(58137100(,我训练了它。除了softmax+categorical_crossentry和sigmoid+binary_crossentritry,我保持所有参数不变。既然我有两个标签,我应该用sigmoid+binary_交叉熵得到更好的精度?这是我的模型。
#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_crossentry,我在测试集上的准确度和其他评估分数(准确度、召回率和f1(更高,有人能向我解释为什么会这样吗?如果我创建的模型有什么问题,请告诉我。
谢谢。
精度应该是相同的(或者非常相似,考虑到你没有为精确的再现性设置种子(,但在比较中,你在这一行犯了一个错误:
model.add(Dense(2, activation='sigmoid'))
这里,对于binary_crossentropy
和sigmoid
,需要1个神经元,而不是2个。
因此,
model.add(Dense(1, activation='sigmoid'))
当然,您需要确保以正确的格式提供数据(sigmoid和BCE[0,1,1,1,...]
,而不是softmax+CCE[[0,1],[1,0],[1,0],[1,0],...]
。