【问题标题】:Why is my tensorflow model transforming binary classification labels from 0 and 1 to .7?为什么我的 tensorflow 模型将二进制分类标签从 0 和 1 转换为 .7?
【发布时间】:2021-04-01 18:43:01
【问题描述】:

我一直在研究一个张量流模型,该模型使用动量指标预测股市的短期正面和负面趋势。我将模型设置为在最后 32 个时间步长的每个时间步中采用 7 个指标的 32x7 矩阵。如果价格在最后一个时间步之后上涨,则标签为 1,如果价格保持不变或下降,则为 0。

我有一个自定义度量函数,可以打印出每个时期的预测和真实值,我发现真实值不是 0 或 1,它们徘徊在 ~.7。对于二元分类,这没有帮助,因为所有预测也将徘徊在 ~.7。谁能向我解释一下可能导致模型以这种方式更改标签的原因?

这是模型和前 10 个 epoch 的截图供参考。

def true(y_true, y_pred):
  return y_true
def pred(y_true, y_pred):
  return y_pred

model = tf.keras.models.Sequential([
          tf.keras.layers.Conv2D(50, kernel_size=(3,3), padding='same', 
            kernel_regularizer=tf.keras.regularizers.l2(0.01)),
          tf.keras.layers.AveragePooling2D((2,2)),
          tf.keras.layers.Conv2D(25, kernel_size=(2,2), padding='same', 
            kernel_regularizer=tf.keras.regularizers.l2(0.01)),
          tf.keras.layers.AveragePooling2D((2,2)),
          tf.keras.layers.Flatten(),
          tf.keras.layers.Dense(1, activation='sigmoid'),
  ])
model.compile(optimizer=tf.keras.optimizers.Adam(lr=1e-5,), loss=tf.keras.losses.Huber(), metrics= 
     ['binary_accuracy', 'mae', pred, true])
model.fit(X,Y, validation_data = (X_val, Y_val), epochs=100, batch_size=100, callbacks=[])

First 10 epochs image

【问题讨论】:

  • 您正在查看真实值的平均值,而不是实际真实值本身。真正的值不会被 keras 改变。
  • @Dr.Snoopy 这是有道理的,但为什么预测都停留在那个意思上呢?我正在尝试创建一个可部署的模型,但它需要能够为此预测 0 和 1。

标签: python tensorflow keras conv-neural-network classification


【解决方案1】:

因为你在你的二元分类模型的最后一层使用了sigmoid激活函数,这是绝对正确的。

Sigmoid 激活函数会给出 0 到 1 之间的输出结果。

对于较小的值 (其中 sigmoid 返回接近于零的值, 预测类将假定为 0。
对于较大的值 (>0.5),
当函数接近 1 时,预测的类将被假定为 1。

您可以使用以下代码将输出值从十进制更改为 0,1

predictions = tf.where(predictions < 0.5, 0, 1)
print('Predictions:\n', predictions.numpy())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 2013-01-09
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 2017-07-12
    • 1970-01-01
    相关资源
    最近更新 更多