首页 > 解决方案 > 二元逻辑回归 - 我们需要 one_hot 编码标签吗?

问题描述

我有一个逻辑回归模型,我参考此链接创建

标签是一个布尔值(0 或 1 作为值)。

在这种情况下,我们是否需要对标签进行 one_hot 编码?

问的原因:我使用下面的函数来查找 cross_entropy 并且损失总是为零。

def cross_entropy(y_true, y_pred):
    y_true = tf.one_hot([y_true.numpy()], 2)
    print(y_pred)
    print(y_true)
    loss_row = tf.nn.softmax_cross_entropy_with_logits(labels=y_true, logits=y_pred)
    print('Loss')
    print(loss_row)
    return tf.reduce_mean(loss_row)

编辑:- 渐变将 [None,None] 作为返回值(用于以下代码)。

def grad(x, y):
with tf.GradientTape() as tape:
    y_pred = logistic_regression(x)
    loss_val = cross_entropy(y, y_pred)       
return tape.gradient(loss_val, [w, b])

示例值

loss_val => tf.Tensor(307700.47, shape=(), dtype=float32)

w => tf.Variable 'Variable:0' shape=(171, 1) dtype=float32, numpy= array([[ 0.7456649 ], [-0.35111237],[-0.6848465 ],[ 0.22605407]]

b => tf.Variable 'Variable:0' shape=(1,) dtype=float32, numpy=array([1.1982833], dtype=float32)

标签: tensorflowmachine-learninglabelone-hot-encoding

解决方案


如果您正在执行普通(二元)逻辑回归(带有 0/1 标签),则使用损失函数tf.nn.sigmoid_cross_entropy_with_logits()

如果您正在进行多类逻辑回归(又名 softmax 回归或多项逻辑回归),那么您有两种选择:

  1. 以 1-hot 格式定义标签(例如[1, 0, 0], [0, 1, 0], ...)并使用损失函数tf.nn.softmax_cross_entropy_with_logits()

  2. 将您的标签定义为单个整数(例如 1、2、3、...)并使用损失函数tf.nn.sparse_softmax_cross_entropy_with_logits()

对于后两者,您可以在此 StackOverflow 问题中找到更多信息:

sparse_softmax_cross_entropy_with_logits 和 softmax_cross_entropy_with_logits 有什么区别?


推荐阅读