Tensorflow四种交叉熵函数

Tensorflow四种交叉熵函数

转载:https://blog.csdn.net/QW_sunny/article/details/72885403

注意:tensorflow交叉熵计算函数输入中的logits都不是softmax或sigmoid的输出,而是softmax或sigmoid函数的输入,因为它在函数内部进行sigmoid或softmax操作

1.1 tf.nn.sigmoid_cross_entropy_with_logits(_sentinel=None,labels=None, logits=None, name=None)

    参数:    
        _sentinel:本质上是不用的参数,不用填
        logits:一个数据类型(type)是float32或float64;
        shape:[batch_size,num_classes],单样本是[num_classes]
        labels:和logits具有相同的type(float)和shape的张量(tensor),
        name:操作的名字,可填可不填
    输出:
        loss,shape:[batch_size,num_classes]
    注:
        它对于输入的logits先通过sigmoid函数计算,再计算它们的交叉熵,但是它对交叉熵的计算方式进行了优化,使得结果不至于溢出,它适用于每个类别相互独立但互不排斥的情况:例如一幅图可以同时包含一条狗和一只大象output不是一个数,而是一个batch中每个样本的loss,所以一般配合tf.reduce_mea(loss)使用
    
    计算公式:

                                                                                    y = labels

                                                                {p_{ij}=sigmoid(logits_{ij} )=\frac{1}{1+e^{-logits_{ij}}}}

                                                            loss_{ij} = -[y_{ij}*lnp_{ij}+(1-y_{ij})ln(1-p_{ij})]

    Python 程序:   

import tensorflow as tf
import numpy as np
def sigmoid(x):
    return 1.0/(1+np.exp(-x))

# 5个样本三分类问题,且一个样本可以同时拥有多类
y = np.array([[1,0,0],[0,1,0],[0,0,1],[1,1,0],[0,1,0]] 
logits = np.array([[12,3,2],[3,10,1],[1,2,5],[4,6.5,1.2],[3,6,1]])
y_pred = sigmoid(logits)
E1 = -y*np.log(y_pred)-(1-y)*np.log(1-y_pred)
print(E1) # 按计算公式计算的结果
sess =tf.Session()
y = np.array(y).astype(np.float64) # labels是float64的数据类型
E2 = sess.run(tf.nn.sigmoid_cross_entropy_with_logits(labels=y,logits=logits))
print(E2)
    
#输出的E1,E2结果相同

1.2 tf.nn.softmax_cross_entropy_with_logits(_sentinel=None, labels=None, logits=None, dim=-1, name=None)
    参数:
        _sentinel:本质上是不用的参数,不用填
        logits:一个数据类型(type)是float32或float64;
        shape:[batch_size,num_classes]
        labels:和logits具有相同type和shape的张量(tensor),,是一个有效的概率,sum(labels)=1, one_hot=True(向量中只有一个值为1.0,其他值为0.0)
        name:操作的名字,可填可不填 
    输出:
        loss,shape:[batch_size]
    
    注:
        它对于输入的logits先通过softmax函数计算,再计算它们的交叉熵,但是它对交叉熵的计算方式进行了优化,使得结果不至于溢出,它适用于每个类别相互独立且排斥的情况,一幅图只能属于一类,而不能同时包含一条狗和一只大象,output不是一个数,而是一个batch中每个样本的loss,所以一般配合tf.reduce_mean(loss)使用

    计算公式:

                                                                             y = labels

                                                   p_{i} = softmax(logits_{i}) = [\frac{e^{logits_{ij}}}{\sum_{j=0}^{numclasses-1}e^{logitss_{ij}}}]

                                                                    loss_{ij} = -\sum_{j=0}^{numclasses-1}y_{ij}*lnp_{ij}


    Python程序:   

import tensorflow as tf
import numpy as np

def softmax(x):
    sum_raw = np.sum(np.exp(x),axis=-1)
    x1 = np.ones(np.shape(x))
    for i inrange(np.shape(x)[0]):
        x1[i] = np.exp(x[i])/sum_raw[i]
    return x1

y = np.array([[1,0,0],[0,1,0],[0,0,1],[1,0,0],[0,1,0]])# 每一行只有一个1
logits =np.array([[12,3,2],[3,10,1],[1,2,5],[4,6.5,1.2],[3,6,1]])
y_pred =softmax(logits)
E1 = -np.sum(y*np.log(y_pred),-1)
print(E1)
sess = tf.Session()
y = np.array(y).astype(np.float64)
E2 = sess.run(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=logits))
print(E2)

#输出的E1,E2结果相同

1.3 tf.nn.sparse_softmax_cross_entropy_with_logits(_sentinel=None,labels=None,logits=None, name=None)
    参数:
        _sentinel:本质上是不用的参数,不用填
        logits:一个数据类型(type)是float32或float64;
        shape:[batch_size,num_classes]
        labels: shape为[batch_size],labels[i]是{0,1,2,……,num_classes-1}的一个索引, type为int32或int64
        name:操作的名字,可填可不填
    输出:
        loss,shape:[batch_size]
    注:
    它对于输入的logits先通过softmax函数计算,再计算它们的交叉熵,但是它对交叉熵的计算方式进行了优化,使得结果不至于溢出,它适用于每个类别相互独立且排斥的情况,一幅图只能属于一类,而不能同时包含一条狗和一只大象 ,output不是一个数,而是一个batch中每个样本的loss,所以一般配合tf.reduce_mean(loss)使用

    计算公式:
    
    和tf.nn.softmax_cross_entropy_with_logits()一样,只是要将labels转换成tf.nn.softmax_cross_entropy_with_logits()中labels的形式


1.4 tf.nn.weighted_cross_entropy_with_logits(labels,logits, pos_weight, name=None) 
    计算具有权重的sigmoid交叉熵sigmoid_cross_entropy_with_logits()
    参数:
        _sentinel:本质上是不用的参数,不用填
        logits:一个数据类型(type)是float32或float64;
        shape:[batch_size,num_classes],单样本是[num_classes]
        labels:和logits具有相同的type(float)和shape的张量(tensor),
        pos_weight:正样本的一个系数
        name:操作的名字,可填可不填
    输出:
        loss,shape:[batch_size,num_classes]
    
    计算公式:

                                                                               y=labels

                                                          p_{ij} = sigmoid(logits_{ij}) = \frac{1}{1+e^{-logits_{ij}}}

                                              loss_{ij} = -[pos\_weight*y_{ij}*lnp_{ij}+(1-y_{ij})ln(1-p_{ij})]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值