如何从Keras的model.predict函数获取预测标签?

时间:2018-07-31 17:11:47

标签: python tensorflow keras lstm

我已经使用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())

3 个答案:

答案 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)