Keras 的 model.predict 函数的输出是什么意思?

数据挖掘 机器学习 Python 神经网络 喀拉斯 lstm
2021-09-26 23:51:30

我已经建立了一个 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 个值。我不明白这些值是什么意思,每个问题对的预测标签是什么?

4个回答

默认情况下,神经网络的输出永远不会是二进制的——即零或一。该网络使用连续值(不是离散的),以便在梯度下降的框架中更自由地优化损失。

在这里查看一个类似的问题,该问题也显示了一些代码。

如果没有任何类型的调整和缩​​放,就其名义值而言,网络的输出可能会落在输入范围内的某个位置。在您的情况下,这似乎大致在 0 到 2 之间。

您现在可以编写一个函数,根据某个阈值将上述值变为 0 或 1。例如,将值缩放到 [0, 1] 范围内,然后如果值低于 0.5,则返回 0,如果高于 0.5,则返回 1。

如果这是一个分类问题,您应该将网络更改为具有 2 个输出神经元。

您可以使用将标签转换为单热编码向量

y_train_binary = keras.utils.to_categorical(y_train, num_classes)
y_test_binary = keras.utils.to_categorical(y_test, num_classes)

然后确保你的输出层有两个具有 softmax 激活函数的神经元。

model.add(Dense(num_classes, activation='softmax'))

这将导致您model.predict(x_test_reshaped)成为一个列表数组。其中内部列表是实例属于每个类的概率。这将加起来为 1,显然决定的标签应该是概率最高的输出神经元。

Keras 已将其包含在他们的库中,因此您无需自己进行此比较。您可以使用 直接获取类标签model.predict_classes(x_test_reshaped)

预测基于您作为训练输出和激活函数输入的内容。

例如,对于 0-1 输入和输出的 sigmoid 激活函数以及二进制交叉熵损失,您将得到 1 的概率。根据在任一方向上做出错误决策的成本,您可以决定如何处理这些概率(例如,预测类别“1”,如果概率>0.5 或者可能已经>0.1)。

根据您的描述,您有 0-1 输入,并且可能假设您的输出层是线性激活的(可能带有均方误差损失?)。这意味着,您假设了一个回归问题,其中输出直接是预测数(可以是(,)。我认为这不是您想要的,您可能想要我在第一段中提到的内容。

我遇到了同样的问题并解决了:

seq_predictions=model.predict(test_sequences)
print('Outputs shape')    
print(seq_predictions.shape) # prints (n,1) but  need (n,)
seq_predictions=np.transpose(seq_predictions)[0]  # transformation to get (n,)
print(seq_predictions.shape)  # now the shape is (n,)
# Applying transformation to get binary values predictions with 0.5 as thresold
seq_predictions = list(map(lambda x: 0 if x<0.5 else 1, seq_predictions))