是不是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] 个值。