是不是common/normal for tf.keras.model.predict() 生成了超出数据范围的值?
Is it common/normal for tf.keras.model.predict() to generate a value outside of the data range?
tf.keras.model.predict()
生成超出给定数据范围的值是否正常?
我从 model.predict()
得到一个负值。模型中使用的目标预测列中的数据仅由 1 或 0 组成。我本以为 model.predict()
会生成一个介于 0 和 1 之间的值。
当我将新的相似数据放入 model.predict()
以尝试进行分类时,我经常得到一个小于 0 或大于 1 的值。我是否应该认为这意味着所有大于 0.5 的值是 1 的可能性更大,值越高是 1 的可能性越大?
这是我的代码:
epoch_count = 1
model = tf.keras.Sequential([
feature_layer,
layers.Dense(128, activation='relu'),
layers.Dense(128, activation='relu'),
layers.Dense(1)
])
model.compile(optimizer='adam',
loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
metrics=['accuracy'])
model.fit(train_ds,
validation_data=val_ds,
epochs=epoch_count)
是的,当您的数据发生变化时可能会发生这种情况。 IE。如果您的数据输入有分布变化,您通常可以将值推向不同的方向。如果您想确保可以得到概率而不是值,请添加一个 softmax 函数。这会将您的输出限制在 0 和 1 之间。
keras.activations.softmax(x, axis=-1)
您感到困惑,因为您的模型实际上输出的是对数,而不是概率(在 [0, 1]
范围内)。
由于您使用 tf.keras.losses.BinaryCrossentropy(from_logits=True)
作为损失,您已将其配置为接受 logits(这就是 from_logits=True
所做的),这意味着在损失内部 sigmoid
激活是正在应用。
训练后,如果您希望输出在 [0, 1]
范围内,您应该应用 sigmoid
激活。你可以这样做:
model.add(Activation('sigmoid'))
在此之后,一旦您在模型上 predict
,您将获得 [0, 1]
个值。
tf.keras.model.predict()
生成超出给定数据范围的值是否正常?
我从 model.predict()
得到一个负值。模型中使用的目标预测列中的数据仅由 1 或 0 组成。我本以为 model.predict()
会生成一个介于 0 和 1 之间的值。
当我将新的相似数据放入 model.predict()
以尝试进行分类时,我经常得到一个小于 0 或大于 1 的值。我是否应该认为这意味着所有大于 0.5 的值是 1 的可能性更大,值越高是 1 的可能性越大?
这是我的代码:
epoch_count = 1
model = tf.keras.Sequential([
feature_layer,
layers.Dense(128, activation='relu'),
layers.Dense(128, activation='relu'),
layers.Dense(1)
])
model.compile(optimizer='adam',
loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
metrics=['accuracy'])
model.fit(train_ds,
validation_data=val_ds,
epochs=epoch_count)
是的,当您的数据发生变化时可能会发生这种情况。 IE。如果您的数据输入有分布变化,您通常可以将值推向不同的方向。如果您想确保可以得到概率而不是值,请添加一个 softmax 函数。这会将您的输出限制在 0 和 1 之间。
keras.activations.softmax(x, axis=-1)
您感到困惑,因为您的模型实际上输出的是对数,而不是概率(在 [0, 1]
范围内)。
由于您使用 tf.keras.losses.BinaryCrossentropy(from_logits=True)
作为损失,您已将其配置为接受 logits(这就是 from_logits=True
所做的),这意味着在损失内部 sigmoid
激活是正在应用。
训练后,如果您希望输出在 [0, 1]
范围内,您应该应用 sigmoid
激活。你可以这样做:
model.add(Activation('sigmoid'))
在此之后,一旦您在模型上 predict
,您将获得 [0, 1]
个值。