tensorflow中四种不同交叉熵函数tf.nn.softmax_cross_entropy_with_logits()

Tensorflow中的交叉熵函数
tensorflow中自带四种交叉熵函数,可以轻松的实现交叉熵的计算。

tf.nn.softmax_cross_entropy_with_logits()
tf.nn.sparse_softmax_cross_entropy_with_logits()
tf.nn.sigmoid_cross_entropy_with_logits()
tf.nn.weighted_cross_entropy_with_logits()
注意:tensorflow交叉熵计算函数输入中的logits都不是softmax或sigmoid的输出,而是softmax或sigmoid函数的输入,因为它在函数内部进行sigmoid或softmax操作。而且不能在交叉熵函数前进行softmax或sigmoid,会导致计算会出错。

一、sigmoid交叉熵
tf.nn.sigmoid_cross_entropy_with_logits(_sentinel=None,labels=None, logits=None, name=None)
argument:   
_sentinel:本质上是不用的参数,不用填
logits:计算的输出,注意是为使用softmax或sigmoid的,维度一般是[batch_size, num_classes] ,单样本是[num_classes]。数据类型(type)是float32或float64;
labels:和logits具有相同的type(float)和shape的张量(tensor),即数据类型和张量维度都一致。
name:操作的名字,可填可不填
output:
loss,shape:[batch_size,num_classes]

注意:它对于输入的logits先通过sigmoid函数计算,再计算它们的交叉熵,但是它对交叉熵的计算方式进行了优化,使得结果不至于溢出。output不是一个数,而是一个batch中每个样本的loss,所以一般配合tf.reduce_mea(loss)使用。

例子:

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(‘按计算公式计算的结果:\n‘,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(‘tf计算的结果:\n‘,E2)
# 输出的E1,E2结果相同

二、softmax交叉熵
tf.nn.softmax_cross_entropy_with_logits(_sentinel=None, labels=None, logits=None, dim=-1, name=None)
argument:
_sentinel:本质上是不用的参数,不用填
logits:计算的输出,注意是为使用softmax或sigmoid的,维度一般是[batch_size, num_classes] ,单样本是[num_classes]。数据类型(type)是float32或float64;
labels:和logits具有相同的type(float)和shape的张量(tensor),即数据类型和张量维度都一致。
name:操作的名字,可填可不填
output:
loss,shape:[batch_size]

其他同上

例子:

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 in range(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)

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(‘按计算公式计算的结果:\n‘, E1)  # 按计算公式计算的结果
print(‘tf计算的结果:\n‘, E2)
# 输出的E1,E2结果相同

三、sparse_softmax交叉熵
tf.nn.sparse_softmax_cross_entropy_with_logits(_sentinel=None,labels=None,logits=None, name=None)
argument:
_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,说白了就是当使用这个函数时,tf自动将原来的类别索引转换成one_hot形式,然后与label表示的one_hot向量比较,计算交叉熵。

name: 操作的名字,可填可不填
output:

loss,shape:[batch_size]

例子:

import tensorflow as tf

# 假设只有三个类,分别编号0,1,2,labels就可以直接输入下面的向量,不用转换与logits一致的维度
labels = [0,1,2]

logits = [[2,0.5,1],
          [0.1,1,3],
          [3.1,4,2]]

logits_scaled = tf.nn.softmax(logits)
result = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=labels, logits=logits)

with tf.Session() as sess:
    print(sess.run(result))

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

感谢:https://blog.csdn.net/qq_35203425/article/details/7977345

原文地址:https://www.cnblogs.com/fclbky/p/12637091.html

时间: 2024-11-05 14:42:09

tensorflow中四种不同交叉熵函数tf.nn.softmax_cross_entropy_with_logits()的相关文章

TensorFlow中的L2正则化函数:tf.nn.l2_loss()与tf.contrib.layers.l2_regularizerd()的用法与异同

tf.nn.l2_loss()与tf.contrib.layers.l2_regularizerd()都是TensorFlow中的L2正则化函数,tf.contrib.layers.l2_regularizerd()函数在tf 2.x版本中被弃用了. 两者都能用来L2正则化处理,但运算有一点不同. import tensorflow as tf sess = InteractiveSession() a = tf.constant([1, 2, 3], dtype=tf.float32) b =

[转]C++中四种类型转换符的总结

C++中四种类型转换符的总结 一.reinterpret_cast用法:reinpreter_cast<type-id> (expression)    reinterpret_cast操作符修改了操作数类型,但仅仅是重新解释了给出的对象的比特模型而没有进行二进制转换,即二进制值没有变.例如: int n=9; double d= reinterpret_cast< double > (n); 在进行计算以后, d 包含无用值. 这是因为 reinterpret_cast 仅仅是复

android在代码中四种设置控件背景颜色的方法(包括RGB)

转载请注明出处: http://blog.csdn.net/fth826595345/article/details/9208771  TextView tText=(TextView) findViewById(R.id.textv_name); //第1种: tText.setTextColor(android.graphics.Color.RED);//系统自带的颜色类 // 第2种: tText.setTextColor(0xffff00ff);//0xffff00ff是int类型的数据

Linux中四种进程或线程同步互斥控制方法

原文地址:http://blog.itpub.net/10697500/viewspace-612045/ 一.Linux中 四种进程或线程同步互斥的控制方法: 1.临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问. 2.互斥量:为协调共同对一个共享资源的单独访问而设计的. 3.信号量:为控制一个具有有限数量用户资源而设计. 4.事 件:用来通知线程有一些事件已发生,从而启动后继任务的开始. 二.临界区(Critical Section) 保证在某一时刻只有一个线程

jsp中四种范围的使用

///////////////////////////jsp中四种范围中的值的获取////////////////////////////////在pageContext,request,session,application四种范围中设置setAttribute()时:1.pageContext:pageContext.setAttribute(),只能在其本页面中取得值,pageContext.getAttribute() 2.request:request.setAttribute(),在

css样式表中四种属性选择器

css样式表中四种属性选择器1> 简易属性 tag[class]{ font-weight:bold } It will affect all tag with any class. e.g. <h2 class="old" > or <h2 class="new"> 2>精确属性值 a[href="http://www.cnblogs.cn"][title="textTitle"]{fon

Android中四种OnClick事件的写法

package com.example.dailphone; import android.support.v7.app.ActionBarActivity; import android.support.v7.app.ActionBar; import android.support.v4.app.Fragment; import android.text.TextUtils; import android.content.Intent; import android.net.Uri; imp

java中四种引用类型

java中四种引用类型  今天看代码,里面有一个类java.lang.ref.SoftReference把小弟弄神了,试想一下,接触java已经有3年了哇,连lang包下面的类都不了解,怎么混.后来在网上查资料,感觉收获颇多,现记录如下. 对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及(reachable)状态,程序才能使用它.从JDK 1.2版本开始,把对象的引用分为4种级别,从而使程序能更加灵活地

JSP中四种传递参数的方法

jsp中四种传递参数的方法,我觉得总结一下,挺好的,以备后用! 1.form表单 2.request.setAttribute();和request.getAttribute(); 3.超链接:<a herf="index.jsp"?a=a&b=b&c=c>name</a> 1.form表单 form.jsp: <%@page contentType="text/html; charset=GB2312"%> &l