1. tf.nn.sigmoid_cross_entropy_with_logits
逻辑还是非常清晰的,
- 首先是labtel和logits,这两个的shape是相同的,然后将logits的每一个元素通过 σ ( x ) = 1 1 + e − x \sigma(x)=\frac{1}{1+e^{-x}} σ(x)=1+e−x1变换。注意,是每一个元素。
- 将正样本对应的位置拿出来,即 C i = 1 C_i=1 Ci=1,去匹配sigmoid之后的每个位置,计算正类的损失函数
L p o s = − log σ ( x ) L_{pos}=-\text{log}\ \sigma(x) Lpos=−log σ(x) - 然后将所有为0的位置拿出来,即 C i = 0 C_i=0 Ci=0,也就是负类,计算负类的损失函数
L n e g = − log ( 1 − σ ( x ) ) L_{neg}=-\text{log}\ (1- \sigma(x)) Lneg=−log (1−σ(x)) - 这个时候,因为我们是针对每一个元素计算的,所以最后得到的肯定还是一个矩阵,所以我们才需要使用
tf.reduce_mean
来对这个矩阵进行求均值
import numpy as np
import tensorflow as tf
def sigmoid(x):
return 1.0/(1+np.exp(-x))
labels=np.array([[1.,0.,0.],[0.,1.,0.],[0.,0.,1.],[0.,1.,0.]])
logits=np.array([[1.,2.,3.],[4.,5.,6.