Tensorflow 加权与 sigmoid 交叉熵损失
Tensorflow weighted vs sigmoid cross-entropy loss
我正在尝试使用 TensorFlow 实现多标签 class化(即,每个输出模式可以有许多活动单元)。该问题不平衡 classes(即,标签分布中的零比标签分布中的零多得多,这使得标签模式非常稀疏)。
解决这个问题的最好方法应该是使用tf.nn.weighted_cross_entropy_with_logits
函数。但是,我收到此运行时错误:
ValueError: Tensor conversion requested dtype uint8 for Tensor with dtype float32
我不明白这里出了什么问题。作为损失函数的输入,我传递标签张量、logits 张量和正 class 权重,这是一个常数:
positive_class_weight = 10
loss = tf.nn.weighted_cross_entropy_with_logits(targets=labels, logits=logits, pos_weight=positive_class_weight)
关于如何解决这个问题的任何提示?如果我只是将相同的标签和 logits 张量传递给 tf.losses.sigmoid_cross_entropy
损失函数,则一切正常(在 Tensorflow 正常运行的意义上,但当然以下训练预测始终为零)。
参见相关问题here。
错误很可能是在损失函数之后抛出的,因为tf.losses.sigmoid_cross_entropy
和tf.nn.weighted_cross_entropy_with_logits
之间唯一显着的区别是返回张量的形状.
看看这个例子:
logits = tf.linspace(-3., 5., 10)
labels = tf.fill([10,], 1.)
positive_class_weight = 10
weighted_loss = tf.nn.weighted_cross_entropy_with_logits(targets=labels, logits=logits, pos_weight=positive_class_weight)
print(weighted_loss.shape)
sigmoid_loss = tf.losses.sigmoid_cross_entropy(multi_class_labels=labels, logits=logits)
print(sigmoid_loss.shape)
张量 logits
和 labels
是一种人工的,并且都具有 (10,)
的形状。但重要的是 weighted_loss
和 sigmoid_loss
是不同的。这是输出:
(10,)
()
这是因为tf.losses.sigmoid_cross_entropy
进行了归约(默认求和)。所以为了复制它,你必须用 tf.reduce_sum(...)
.
包装加权损失
如果这没有帮助,请确保 labels
张量的类型为 float32
。这个错误很容易犯,例如,下面的声明将不起作用:
labels = tf.fill([10,], 1) # the type is not float!
您可能也有兴趣阅读 。
我正在尝试使用 TensorFlow 实现多标签 class化(即,每个输出模式可以有许多活动单元)。该问题不平衡 classes(即,标签分布中的零比标签分布中的零多得多,这使得标签模式非常稀疏)。
解决这个问题的最好方法应该是使用tf.nn.weighted_cross_entropy_with_logits
函数。但是,我收到此运行时错误:
ValueError: Tensor conversion requested dtype uint8 for Tensor with dtype float32
我不明白这里出了什么问题。作为损失函数的输入,我传递标签张量、logits 张量和正 class 权重,这是一个常数:
positive_class_weight = 10
loss = tf.nn.weighted_cross_entropy_with_logits(targets=labels, logits=logits, pos_weight=positive_class_weight)
关于如何解决这个问题的任何提示?如果我只是将相同的标签和 logits 张量传递给 tf.losses.sigmoid_cross_entropy
损失函数,则一切正常(在 Tensorflow 正常运行的意义上,但当然以下训练预测始终为零)。
参见相关问题here。
错误很可能是在损失函数之后抛出的,因为tf.losses.sigmoid_cross_entropy
和tf.nn.weighted_cross_entropy_with_logits
之间唯一显着的区别是返回张量的形状.
看看这个例子:
logits = tf.linspace(-3., 5., 10)
labels = tf.fill([10,], 1.)
positive_class_weight = 10
weighted_loss = tf.nn.weighted_cross_entropy_with_logits(targets=labels, logits=logits, pos_weight=positive_class_weight)
print(weighted_loss.shape)
sigmoid_loss = tf.losses.sigmoid_cross_entropy(multi_class_labels=labels, logits=logits)
print(sigmoid_loss.shape)
张量 logits
和 labels
是一种人工的,并且都具有 (10,)
的形状。但重要的是 weighted_loss
和 sigmoid_loss
是不同的。这是输出:
(10,)
()
这是因为tf.losses.sigmoid_cross_entropy
进行了归约(默认求和)。所以为了复制它,你必须用 tf.reduce_sum(...)
.
如果这没有帮助,请确保 labels
张量的类型为 float32
。这个错误很容易犯,例如,下面的声明将不起作用:
labels = tf.fill([10,], 1) # the type is not float!
您可能也有兴趣阅读