tensorflow - 二元逻辑回归 - 我们需要 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)
解决方案
如果您正在执行普通(二元)逻辑回归(带有 0/1 标签),则使用损失函数tf.nn.sigmoid_cross_entropy_with_logits()。
如果您正在进行多类逻辑回归(又名 softmax 回归或多项逻辑回归),那么您有两种选择:
以 1-hot 格式定义标签(例如
[1, 0, 0]
,[0, 1, 0]
, ...)并使用损失函数tf.nn.softmax_cross_entropy_with_logits()将您的标签定义为单个整数(例如 1、2、3、...)并使用损失函数tf.nn.sparse_softmax_cross_entropy_with_logits()
对于后两者,您可以在此 StackOverflow 问题中找到更多信息:
sparse_softmax_cross_entropy_with_logits 和 softmax_cross_entropy_with_logits 有什么区别?
推荐阅读
- node.js - 如何在新的包名字对象规则之后检查 npm 包名称的可用性?
- string - 在 Groovy 中将字符串转换为 InputStream
- android - KeyguardManager - api 25 及更低版本的 requestDismissKeyguard() 方法替代 [Android]
- angular - angular 6(无法确定 @angular/compiler-cli 和 typescript 的版本)
- java - Java 内存泄漏,持有已处置的 JFrame 的未知线程
- android - 如何在android项目中获取当前的Unix时间戳UTC时间(互联网时间)
- machine-learning - 序数逻辑回归与逻辑回归有何不同?
- css - CSS Grid——行高的整数倍
- php - 获取与 PHP 函数的距离
- fullpage.js - 防止向下滑动以对 Fullpage js 中的鼠标滚轮滚动执行一些其他操作