目录
tf.nn.sigmoid_cross_entropy_with_logits 计算给定logits的sigmoid交叉熵。
tf.nn.weighted_cross_entropy_with_logits 计算加权交叉熵
tf.nn.softmax_cross_entropy_with_logits 计算logits和labels之间的softmax交叉熵
tf.nn.sparse_softmax_cross_entropy_with_logits
tf.nn.sigmoid_cross_entropy_with_logits 计算给定logits的sigmoid交叉熵。
测量离散分类任务中的概率误差,其中每个类是独立的而不是互斥的。例如,可以执行多标签分类,其中图片可以同时包含大象和狗
z * -log(sigmoid(x)) + (1 - z) * -log(1 - sigmoid(x))
tf.nn.sigmoid_cross_entropy_with_logits(
_sentinel=None,
labels=None,
logits=None,
name=None
)
logits和labels必须具有相同的类型和shape。
参数:
- _sentinel:用于防止positional参数。内部的,不要使用。
- labels:一个Tensor,与logits具有相同的类型和shape。
- logits:一个Tensor,类型为float32或float64。
- name:操作的名称(可选)。
返回:
与具有分量logistic损失的logits有着相同shape的Tensor。
可能引发的异常:
- ValueError:如果logits和labels没有相同的shape。
tf.nn.weighted_cross_entropy_with_logits 计算加权交叉熵
类似于sigmoid_cross_entropy_with_logits(),除了pos_weight,允许人们通过向上或向下加权相对于负误差的正误差的成本来权衡召回率和精确度。
通常的交叉熵成本定义为:
targets * -log(sigmoid(logits)) + (1 - targets) * -log(1 - sigmoid(logits))
函数表达式
tf.nn.weighted_cross_entropy_with_logits(
targets,
logits,
pos_weight,
name=None
)
logits和targets必须具有相同的类型和形状。
参数:
- targets:一个Tensor,与logits具有相同的类型和形状。
- logits:一个Tensor,类型为float32或float64。
- pos_weight:正样本中使用的系数。
- name:操作的名称(可选)。
返回:
与具有分量加权逻辑损失的logits具有相同形状的Tensor。返回各个维度计算结果
可能引发的异常:
- ValueError:如果logits和targets没有相同的形状。
tf.nn.softmax_cross_entropy_with_logits 计算logits和labels之间的softmax交叉熵
测量离散分类任务中的概率误差,其中类是互斥的(每个条目恰好在一个类中)。 例如,每个CIFAR-10图像都标有一个且只有一个标签:图像可以是dog或truck,但不能同时是两者
tf.nn.softmax_cross_entropy_with_logits(
_sentinel=None,
labels=None,
logits=None,
dim=-1,
name=None
)
参数:
- _sentinel:用于防止positional参数。内部的,不要使用。
- labels:沿着类维度的每个向量应该保持有效的概率分布,例如:对于标签shape为[batch_size, num_classes]的情况,labels[i]的每一行必须是有效的概率分布。
- logits:未缩放的日志概率。
- dim:类维度。默认为-1,这是最后一个维度。
- name:操作的名称(可选)。
返回:
一个Tensor,包含softmax交叉熵损失的。它的类型与logits相同,它的shape与labels是相同的,除了它没有labels的最后一个维度。
tf.nn.sparse_softmax_cross_entropy_with_logits
功能:计算logits和labels之间的稀疏softmax交叉熵
测量离散分类任务中的概率误差,其中类是互斥的(每个条目仅在一个类中)。例如,每个CIFAR-10图像都标有一个且只有一个标签:图像可以是dog或truck,但不能同时是两者
tf.nn.sparse_softmax_cross_entropy_with_logits(
_sentinel=None,
labels=None,
logits=None,
name=None
)
参数:
- _sentinel:用于防止位置参数。内部,不要使用。
- labels:Tensor,shape为[d_0, d_1, ..., d_{r-1}](其中r是labels的秩和结果)并且类型为int32或int64。每个labels中的条目必须是[0, num_classes)中的索引。当此操作在CPU上运行时,其他值将引发异常,并返回NaN,以获取GPU上相应的损失和梯度行。
- logits:shape为[d_0, d_1, ..., d_{r-1}, num_classes]和类型为float16,float32或 float64的未缩放日志概率。
- name:操作的名称(可选)。
返回:
一个Tensor,与labels形状相同、与具有SoftMax交叉熵损失的logits具有相同的类型。
可能引发的异常:
- ValueError:如果logits是标量(需要秩> = 1),或者labels的秩不等于logits的秩减1。
函数案例
import tensorflow as tf
import os
import numpy as np
y1=tf.constant([0,1],dtype=tf.float32)
y2=tf.constant([0.2,0.8],dtype=tf.float32)
loss=tf.nn.weighted_cross_entropy_with_logits(logits=y2,labels=y1,pos_weight=10)
loss_1=tf.nn.softmax_cross_entropy_with_logits(labels=y1,logits=y2)
loss_2=tf.nn.sigmoid_cross_entropy_with_logits(labels=y1,logits=y2)
with tf.Session() as sess:
print("sigmoid_cross",sess.run(loss_2))
print("weighted_cross",sess.run(loss))
print("softmax_cross",sess.run(loss_1))
def sigmoid(z):
return 1/(1+np.exp(-z))
def f1(z):
return np.log(1-sigmoid(z))
def f2(z):
return np.log(sigmoid(z))
print("my_weighted_cross",[-f1(0.2),-f2(0.8)*10])
sigmoid_cross [0.79813886 0.3711007 ]
weighted_cross [0.79813886 3.7110069 ]
softmax_cross 0.437488
my_weighted_cross [0.798138869381592, 3.711006659477776]