我已经使用Keras库构建了一个LSTM模型,以预测Quora官方数据集上的重复问题。测试标签为0或1。1表示问题对重复。使用model.fit
构建模型后,我在测试数据上使用model.predict
测试模型。输出是一个值(概率)数组,如下所示:
[ 0.00514298]
[ 0.15161049]
[ 0.27588326]
[ 0.00236167]
[ 1.80067325]
[ 0.01048524]
[ 1.43425131]
[ 1.99202418]
[ 0.54853892]
[ 0.02514757]
我只显示数组中的前10个值。我不了解这些值的含义,以及如何将其与测试标签进行比较以计算测试准确性。我希望模型将二进制预测值输出为0或1,而不是概率。请参考下面我代码的最后一部分:
sequence_1_input = Input(shape=(MAX_SEQUENCE_LENGTH,), dtype='int32')
embedded_sequences_1 = embedding_layer(sequence_1_input)
x1 = lstm_layer(embedded_sequences_1)
sequence_2_input = Input(shape=(MAX_SEQUENCE_LENGTH,), dtype='int32')
embedded_sequences_2 = embedding_layer(sequence_2_input)
y1 = lstm_layer(embedded_sequences_2)
merged = concatenate([x1, y1])
merged = Dropout(rate_drop_dense)(merged)
merged = BatchNormalization()(merged)
merged = Dense(num_dense, activation=act)(merged)
merged = Dropout(rate_drop_dense)(merged)
merged = BatchNormalization()(merged)
preds = Dense(1, activation='sigmoid')(merged)
########################################
## train the model
########################################
model = Model(inputs=[sequence_1_input, sequence_2_input], \
outputs=preds)
model.compile(loss='binary_crossentropy',
optimizer='nadam',
metrics=['acc'])
hist = model.fit([data_1_train, data_2_train], labels_train, \
validation_data=([data_1_val, data_2_val], labels_val, weight_val), \
epochs=200, batch_size=2048, shuffle=True, \
class_weight=class_weight, callbacks=[early_stopping, model_checkpoint])
preds = model.predict([test_data_1, test_data_2], batch_size=8192,
verbose=1)
preds += model.predict([test_data_2, test_data_1], batch_size=8192,
verbose=1)
preds /= 2
print(type(preds))
print(preds[:20])
print('preds.ravel')
print(preds.ravel())
答案 0 :(得分:1)
正如您所说,您的输出是一个带有概率的np array
。您可以通过执行(model.predict(X) > 0.5).astype(int)
答案 1 :(得分:0)
人工神经网络是概率分类器,因此您的输出是绝对好的。只是属于您的目标标签的概率。
另外一个有趣的事实是0.5可能不是您要使用的offet。这取决于您的任务中正阳性和假阳性的重要性。您可以查看ROC Curves来找到最佳偏移量。
答案 2 :(得分:0)
您可以尝试在最后一层将激活函数更改为softmax,或者可以制作自己的softmax函数并将输出传递给该函数。这是自定义softmax函数的示例
def softmax(x):
return np.exp(x) / np.sum(np.exp(x), axis=0)