Tensorflow 2.0 - 这些模型预测是否代表概率?
Tensorflow 2.0 - do these model predictions represent probabilities?
我有一个非常简单的 Tensorflow 2 Keras 模型来对某些数据进行惩罚逻辑回归。我希望得到每个 class 的概率,而不仅仅是 [0 或 1] 的预测值。
我想我得到了我想要的,但只是想确保这些数字是我认为的那样。我使用了 Tensorflow.keras 中的 model.predict_on_batch()
函数,但文档只是说这提供了 预测 的 numpy
数组。但是我相信我得到 概率 ,但我希望有人可以确认。
模型代码如下所示:
feature_layer = tf.keras.layers.DenseFeatures(features)
model = tf.keras.Sequential([
feature_layer,
layers.Dense(1, activation='sigmoid', kernel_regularizer=tf.keras.regularizers.l1(0.01))
])
model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'])
predictions = model.predict_on_batch(validation_dataset)
print('Predictions for a single batch.')
print(predictions)
所以我得到的预测看起来像:
Predictions for a single batch.
tf.Tensor(
[[0.10916319]
[0.14546806]
[0.13057315]
[0.11713684]
[0.16197902]
[0.19613355]
[0.1388464 ]
[0.14122346]
[0.26149303]
[0.12516734]
[0.1388464 ]
[0.14595506]
[0.14595506]]
现在用于逻辑回归中的预测,该预测将是 0 或 1 的数组。但是因为我正在获取浮点值。但是,当示例实际为 0 的概率和示例为 1 的概率时,我只是得到一个值。所以我想像每行或示例有 2 个概率的数组。当然,Probability(Y = 0) + Probability(Y = 1) = 1,所以这可能只是一些简洁的表示。
那么,下面数组中的值是否表示示例或 Y = 1 或其他值的概率?
此处表示的值:
tf.Tensor(
[[0.10916319]
[0.14546806]
[0.13057315]
[0.11713684]
[0.16197902]
[0.19613355]
[0.1388464 ]
[0.14122346]
[0.26149303]
[0.12516734]
[0.1388464 ]
[0.14595506]
[0.14595506]]
你的每一个class对应的概率是多少
由于您在最后一层使用了 sigmoid
激活,这些将
在 [0, 1].
范围内
您的模型非常浅(层数少),因此这些预测概率在 class 之间非常接近。我建议你多加几层。
结论
为了回答您的问题,这些是概率,但仅取决于您选择的激活函数 (sigmoid
)。如果您使用 tanh
激活,这些将在 [-1,1] 范围内。
请注意,由于使用了 binary_crossentropy
损失,每个 class 的这些概率为 "binary" - 即 class 1 存在的概率为 10.92%,存在概率为 89.08%不是,其他 classes 依此类推。如果您希望预测遵循概率规则 (sum = 1),那么您应该考虑 categorical_crossentropy
.
我有一个非常简单的 Tensorflow 2 Keras 模型来对某些数据进行惩罚逻辑回归。我希望得到每个 class 的概率,而不仅仅是 [0 或 1] 的预测值。
我想我得到了我想要的,但只是想确保这些数字是我认为的那样。我使用了 Tensorflow.keras 中的 model.predict_on_batch()
函数,但文档只是说这提供了 预测 的 numpy
数组。但是我相信我得到 概率 ,但我希望有人可以确认。
模型代码如下所示:
feature_layer = tf.keras.layers.DenseFeatures(features)
model = tf.keras.Sequential([
feature_layer,
layers.Dense(1, activation='sigmoid', kernel_regularizer=tf.keras.regularizers.l1(0.01))
])
model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'])
predictions = model.predict_on_batch(validation_dataset)
print('Predictions for a single batch.')
print(predictions)
所以我得到的预测看起来像:
Predictions for a single batch.
tf.Tensor(
[[0.10916319]
[0.14546806]
[0.13057315]
[0.11713684]
[0.16197902]
[0.19613355]
[0.1388464 ]
[0.14122346]
[0.26149303]
[0.12516734]
[0.1388464 ]
[0.14595506]
[0.14595506]]
现在用于逻辑回归中的预测,该预测将是 0 或 1 的数组。但是因为我正在获取浮点值。但是,当示例实际为 0 的概率和示例为 1 的概率时,我只是得到一个值。所以我想像每行或示例有 2 个概率的数组。当然,Probability(Y = 0) + Probability(Y = 1) = 1,所以这可能只是一些简洁的表示。
那么,下面数组中的值是否表示示例或 Y = 1 或其他值的概率?
此处表示的值:
tf.Tensor(
[[0.10916319]
[0.14546806]
[0.13057315]
[0.11713684]
[0.16197902]
[0.19613355]
[0.1388464 ]
[0.14122346]
[0.26149303]
[0.12516734]
[0.1388464 ]
[0.14595506]
[0.14595506]]
你的每一个class对应的概率是多少
由于您在最后一层使用了
sigmoid
激活,这些将 在 [0, 1]. 范围内
您的模型非常浅(层数少),因此这些预测概率在 class 之间非常接近。我建议你多加几层。
结论
为了回答您的问题,这些是概率,但仅取决于您选择的激活函数 (sigmoid
)。如果您使用 tanh
激活,这些将在 [-1,1] 范围内。
请注意,由于使用了 binary_crossentropy
损失,每个 class 的这些概率为 "binary" - 即 class 1 存在的概率为 10.92%,存在概率为 89.08%不是,其他 classes 依此类推。如果您希望预测遵循概率规则 (sum = 1),那么您应该考虑 categorical_crossentropy
.