函数定义 def sigmoid_cross_entropy_with_logits(_sentinel=None, # pylint: disable=invalid-name,labels=None , logits=None,name=None): 函数意义 这个函数的作用是计算经sigmoid 函数激活之后的交叉熵。 为了描述简洁,我们规定 x = logits,z = targets,那么 Logistic 损失值为: 对于x<0的情况,为了执行的稳定,使用计算式: 为了确保计算稳定,避免溢出,真实的计算实现如下 : logits 和 targets 必须有相同的数据类型和数据维度。 数据类型和数据维度都和 logits 相同。 name: 为这个操作取个名字。输出 一个 Tensor ,数据维度和 logits 相同。
weighted_cross_entropy_with_logits(targets, logits, pos_weight, name=None): 此函数功能以及计算方式基本与tf_nn_sigmoid_cross_entropy_with_logits 是计算具有权重的sigmoid交叉熵函数 计算方法 : 官方文档定义及推导过程: 通常的cross-entropy交叉熵函数定义如下: 对于加了权值pos_weight的交叉熵函数: 现在我们使用 x = logits 参数: _sentinel:本质上是不用的参数,不用填 targets:一个和logits具有相同的数据类型(type)和尺寸形状(shape)的张量(tensor) shape:[batch_size ,num_classes],单样本是[num_classes] logits:一个数据类型(type)是float32或float64的张量 pos_weight:正样本的一个系数 name:操作的名字 (logits=input_data, targets=[[1.0, 0.0, 0.0], [0.0,
, logits=None,dim=-1, name=None) 解释 这个函数的作用是计算 logits 经 softmax 函数激活之后的交叉熵。 (这也是和 tf.nn.sigmoid_cross_entropy_with_logits(logits, targets, name=None)这个API的区别) 说明 输入API的数据 logits 不能进行缩放,因为在这个API的执行中会进行 softmax 计算,如果 logits 进行了缩放,那么会影响计算正确率。 logits 和 labels 必须有相同的数据维度 [batch_size, num_classes],和相同的数据类型 float32 或者 float64 。 输出参数 一个 Tensor ,数据维度是一维的,长度是 batch_size,数据类型都和 logits 相同。
定义 sparse_softmax_cross_entropy_with_logits(_sentinel=None, # pylint: disable=invalid-name,labels=None , logits=None,name=None): 说明 此函数大致与tf_nn_softmax_cross_entropy_with_logits的计算方式相同, 适用于每个类别相互独立且排斥的情况, 的一个索引, type为int32或int64,即labels限定了是一个一阶tensor,并且取值范围只能在分类数之内,表示一个对象只能属于一个类别 参数 _sentinel:本质上是不用的参数,不用填 logits 0.2, 0.1, 0.9], [0.3, 0.4, 0.6]], dtype=tf.float32) output = tf.nn.sparse_softmax_cross_entropy_with_logits (logits=input_data, labels=[0, 2]) with tf.Session() as sess: init = tf.global_variables_initializer
tf.multinomial(logits, num_samples) 第一个参数logits可以是一个数组,每个元素的值表示对应index的选择概率。 假设logits有两个元素,即[0.6,0.4],这表示的意思是取 0 的概率是0.6, 取 1 的概率是0.4。 第二个参数num_samples表示抽样的个数。
在计算loss的时候,最常见的一句话就是 tf.nn.softmax_cross_entropy_with_logits ,那么它到底是怎么做的呢? 首先明确一点,loss是代价值,也就是我们要最小化的值 tf.nn.softmax_cross_entropy_with_logits(logits, labels, name=None) 除去name 参数用以指定该操作的name,与方法有关的一共两个参数: 第一个参数logits:就是神经网络最后一层的输出,如果有batch的话,它的大小就是[batchsize,num_classes],单样本的话 理论讲完了,上代码 import tensorflow as tf #our NN's output logits=tf.constant([[1.0,2.0,3.0],[1.0,2.0,3.0], (logits, y_))#dont forget tf.reduce_sum()!!
在深度学习中,几乎每个分类模型的最后一层都会做这样一件事:logits=model(x)#比如[2.1,-0.5,1.3]probs=softmax(logits)#变成[0.68,0.05,0.27] 一、logits是什么?它承载了什么信息?首先明确:logits不是随便的数字,而是模型对每个类别的“未归一化置信度”。 整个训练过程都建立在“logits与概率语义一致”的基础上。三、既然意义等效,为什么还要转换?这是一个自然的追问:如果logits和概率“说的是一回事”,干嘛多此一举? logits无法直接提供置信度解释。2.损失函数依赖概率公理交叉熵损失:要求是合法概率。若用logits:可能为负→无定义;和不为1→违反概率基本规则;导致训练不稳定甚至崩溃。 Softmax是让logits适配概率损失的“语法合规器”。
tf.nn.weighted_cross_entropy_with_logits 其中, 交叉熵相关的损失函数有: sigmoid_cross_entropy_with_logits weighted_cross_entropy_with_logits softmax_cross_entropy_with_logits softmax_cross_entropy_with_logits_v2 sparse_softmax_cross_entropy_with_logits 该 op 内部对 logits 有 softmax 处理, 效率更高, 因此其输入需要未归一化的 logits. 不需使用 softmax 的输出. 否则, 结果会不正确. 同 softmax_cross_entropy_with_logits 和 softmax_cross_entropy_with_logits_v2. 该 op 内部对 logits 有 softmax 处理, 效率更高, 因此其输入需要未归一化的 logits. 不需使用 softmax 的输出. 否则, 结果会不正确.
参考书 《TensorFlow:实战Google深度学习框架》(第2版) 两个计算交叉熵函数的区别:tf.nn.softmax_cross_entrypy_with_logits和tf.nn.sparse_softmax_cross_entrypy_with_logits 但这里计算交叉熵的函数直接输入logits即可 predict_logits = tf.constant([[2.0, -1.0, 3.0], [1.0, 0.0, -0.5]]) # 使用sparse_softmax_cross_entropy_with_logits 计算交叉熵 loss = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=word_labels, logits=predict_logits (labels=word_prob_distribution, logits=predict_logits) # 运行结果与上面相同 y = sess.run(loss) print(y) # 由于softmax_cross_entropy_with_logits (labels=word_prob_distribution, logits=predict_logits) z = sess.run(loss) print(z) 运行结果: ?
alpha self.size_average = size_average self.elipson = 0.000001 def forward(self, logits () > 3: logits = logits.contiguous().view(logits.size(0), logits.size(1), logits.size(2), -1) logits = logits.transpose(2, 3) logits = logits.contiguous().view(-1, logits.size (1), logits.size(3)).squeeze() assert(logits.size(0) == labels.size(0)) assert(logits.size (2) == labels.size(1)) batch_size = logits.size(0) labels_length = logits.size(1)
详细内容参考API文档1. sigmoid_cross_entropy_with_logitstf.nn.sigmoid_cross_entropy_with_logits(logits=logits, (labels=y,logits=logits))print(E2) # 按 tf 封装方法计算if E1.all() == E2.all(): print("True")else: (_sentinel=None, labels=None, logits=None, dim=-1, name=None)labels:和logits具有相同type和shape的张量(tensor), (labels=y,logits=logits))print(E2)if E1.all() == E2.all(): print("True")else: print("False")# 输出的 ()中labels的形式4. weighted_cross_entropy_with_logitstf.nn.weighted_cross_entropy_with_logits(labels,logits
import numpy as np def softmax(logits): exp_logits = np.exp(logits) probabilities = exp_logits exp_logits = np.exp(logits_example) print("指数函数结果:", exp_logits) # 2: 计算指数化分数的和 sum_exp_logits = np.sum (exp_logits) print("指数化分数的和:", sum_exp_logits) # 3: 计算Softmax概率 softmax_probabilities = exp_logits / (logits, labels): probabilities = softmax(logits) # Plot logits plt.figure(figsize=( def softmax(logits): max_logit = np.max(logits) exp_logits = np.exp(logits - max_logit) probabilities
(logits, labels, name=None) def sparse_softmax_cross_entropy_with_logits(logits, labels, name=None): #logits是最后一层的z(输入) #A common use case is to have logits of shape `[batch_size, num_classes]` and #labels (logits, targets, dim=-1, name=None) def softmax_cross_entropy_with_logits(logits, targets, dim=-1, name ], 里面保存是batch中每个样本的cross entropy tf.nn.sigmoid_cross_entropy_with_logits(logits, targets, name=None) def sigmoid_cross_entropy_with_logits(logits, targets, name=None): #logits:[batch_size, num_classes],
1、tf.nn.sigmoid_cross_entropy_with_logits(_sentinel=None, labels=None, logits=None, name=None) _sentinel 单样本是[num_classes] logits:一个数据类型(type)是float32或float64的张量 name:操作的名字,可填可不填 它对于输入的logits先通过sigmoid函数计算, [i]必须是一个有效的概率分布,one_hot=True(向量中只有一个值为1,其他值为0) logits:labels和logits具有相同的数据类型(type)和尺寸(shape) shape:[batch_size ,而不能同时包含一条狗和一只大象 3、tf.nn.sparse_softmax_cross_entropy_with_logits(_sentinel=None, labels=None, logits (labels, logits, pos_weight, name=None) 计算具有权重的sigmoid交叉熵sigmoid_cross_entropy_with_logits() _sentinel
out_logits = array_ops.concat(1, [true_logits, sampled_logits]) # true_logits is a float tensor, 之后将输出的logits和out_labels输入到sampled_losses = sigmoid_cross_entropy_with_logits( logits, labels, (name, "logistic_loss", [logits, targets]) as name: logits = ops.convert_to_tensor(logits, name=" zeros = array_ops.zeros_like(logits, dtype=logits.dtype) cond = (logits >= zeros) relu_logits = math_ops.select(cond, logits, zeros) neg_abs_logits = math_ops.select(cond, -logits, logits)
/labels 的形状是否严格相等assert logits.shape == labels.shape, f"shape mismatch: {logits.shape} vs {labels.shape }"3️⃣ 查调用栈:谁在 squeeze/unsqueeze常见来源:labels = labels.squeeze() 把 [B,1] 挤成 [B];或 logits = logits.squeeze = labels.float().view(-1, 1) # [B,1]loss = F.binary_cross_entropy_with_logits(logits, labels)# 方案 B: (logits, labels)2️⃣ 多标签(C 类独立二分类)logits = model(x) # [B, C]labels = labels.float() # [B, C](独热或 0/1 多热)assert logits.shape == labels.shapeloss = F.binary_cross_entropy_with_logits(logits
).shape:",np.array(layer_logits).shape) layer_logits = tf.concat(layer_logits, axis=2) # 第三维度拼接[ batchsize,max_len,12] print("layer_logits.shape:",layer_logits.shape) layer_dist = tf.nn.softmax , 768), dtype=float32) np.array(layer_logits).shape: (12,) layer_logits.shape: (?, ? ,11] #print("logits.shape:",logits.shape) self.logits = tf.nn.bias_add(logits, output_bias self.logits, axis=-1) # [?
2️⃣ 对 logits/target 做强约束断言分类:def guard_ce_shapes(logits, target): # logits: [B,C], target: [B](Long , 0..C-1) assert logits.dim()==2, f"logits shape {logits.shape}" assert target.dim()==1 and target.size , target): # logits: [B,C,H,W], target: [B,H,W] (Long, 0..C-1) assert logits.dim()==4, f"logits () # 确保 Longloss = F.cross_entropy(logits, labels)2️⃣ 语义分割# 正确:logits [B,C,H,W];mask [B,H,W , soft_targets): # logits: [B,C], soft_targets: [B,C] (sum=1) log_prob = F.log_softmax(logits,
, end_logits = logits.split(1, dim=-1) # (batch_size, num_tokens) start_logits = start_logits.squeeze (-1) end_logits = end_logits.squeeze(-1) return start_logits, end_logits 方案2 Char-NN = self.logits(features) start_logits, end_logits = logits[:, :, 0], logits[:, :, 1] = self.logits(features) start_logits, end_logits = logits[:, :, 0], logits[:, :, 1] = self.logits(features) start_logits, end_logits = logits[:, :, 0], logits[:, :, 1]
= logits.split(1, dim=-1) start_logits = start_logits.squeeze(-1) end_logits , 1] [batch, seq_len] start_logits = start_logits*rationale_logits end_logits = unk_logits.squeeze(-1) # yes_logits = yes_logits.squeeze(-1) # no_logits = no_logits.squeeze ,513标识YES,514标识NO new_start_logits = torch.cat([start_logits, unk_logits, yes_logits, no_logits = IO_logits.cuda() return start_logits, end_logits, unk_logits, yes_logits, no_logits, switch_logits