Tensorflow学习笔记-softmax、cross_entroy
来源:互联网 发布:百度足球大数据预测 编辑:程序博客网 时间:2024/06/08 11:15
Tensorflow学习笔记-softmax_cross_entropy_with_logits
神经网络模型的效果和优化的目标都是通过损失函数(loss function)来定义的。无论是分类问题还是回归问题都是遇见损失函数。
分类的损失函数
但是在分类问题中,如果评价输出结果的准确性呢?常用的方法是使用交差熵(cross entropy),它刻画了两个概率分布之间的距离,它是分类问题中使用比较广的损失函数。
y是样本的正确结果,y’是经过神经网络的输出结果。
而损失函数一般都会配合softmax回归一起使用,而什么是softmax回归呢?
注意:交差熵定义的两个概率分布的距离,但是神经网络的输出却不是概率分布。因此需要将网络的输出结果转化为概率分布,因此需要将神经网络输出层后在加上一个softmax层,将神经网络的输出变成一个概率分布。
神经网络经过softmax层输出的概率分布为:
softmax的公式是:
此时就可以可以使用交差熵来评估输入数据经过神经网络处理后得到的输出结果y’与正确结果y的距离,距离越小,代表我们设计的神经网络效果越好。
例如有一个三分类问题,某个样本的正确答案为[1,0,0],某个模型经过softmax回归的预测结果为(0.5,0.4,0.1),那么它和正确结果的交差熵为:
但另外一个模型的输出结果为(0.8,0.1,0.1),则预测值与真实值的交差熵为:
从直观的结果可以看出,第二个预测结果要好于第一个预测结果,这和通过交差熵得到的结果是一致的。
在Tensorflow计算loss的时候,最常见的一句话就是tf.nn.softmax_cross_entropy_with_logits(logits, labels, name=None),那么它到底是怎么做的呢?首先明确一点,loss是代价值,也就是我们要最小化的值。
代码中的解释为:
Computes softmax cross entropy between `logits` and `labels‘
从函数的名字中可以看出,softmax_cross_entropy_with_logits包含两个作用:1、计算softmax回归,2、求cross_entropy。
除去name参数用以指定该操作的name,与方法有关的一共两个参数:
第一个参数logits:就是神经网络最后一层的输出,如果有batch的话,它的大小就是[batch_size,num_classes],单样本的话,大小就是num_classes
第二个参数labels:实际的标签,大小同上。
第一步是先对网络最后一层的输出做一个softmax,这一步通常是求取输出属于某一类的概率,对于单样本而言,输出就是一个num_classes大小的向量([Y1,Y2,Y3…]其中Y1,Y2,Y3…分别代表了是属于该类的概率)
第二步是softmax的输出向量[Y1,Y2,Y3…]和样本的实际标签做一个交叉熵。
注意!!!这个函数的返回值并不是一个数,而是一个向量,如果要求交叉熵,我们要再做一步tf.reduce_sum操作,就是对向量里面所有元素求和,最后才得到,如果求loss,则要做一步tf.reduce_mean操作,对向量求均值!
例子
下面通过代码,详细说明它的作用:
import tensorflow as tf #our NN's output logits=tf.constant([[1.0,2.0,3.0],[1.0,2.0,3.0],[1.0,2.0,3.0]]) #step1:do softmax y=tf.nn.softmax(logits) #true label y_=tf.constant([[0.0,0.0,1.0],[0.0,0.0,1.0],[0.0,0.0,1.0]]) #step2:do cross_entropy cross_entropy = -tf.reduce_sum(y_*tf.log(y)) #do cross_entropy just one step cross_entropy2=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y_))#dont forget tf.reduce_sum()!! with tf.Session() as sess: softmax=sess.run(y) c_e = sess.run(cross_entropy) c_e2 = sess.run(cross_entropy2) print("step1:softmax result=") print(softmax) print("step2:cross_entropy result=") print(c_e) print("Function(softmax_cross_entropy_with_logits) result=") print(c_e2)
输出结果为:
step1:softmax result= [[ 0.09003057 0.24472848 0.66524094] [ 0.09003057 0.24472848 0.66524094] [ 0.09003057 0.24472848 0.66524094]] step2:cross_entropy result= 1.22282 Function(softmax_cross_entropy_with_logits) result= 0.407606
例子中,batch的大小为3,经过softmax回归输出的结果是一个3×3的二维矩阵,根据交差熵的公式,应该将每行的结果相加得到3个输入样本的的交差熵,然后在对3行取平均得到这个batch的平均交差熵。但因为分类问题的类别是不变的,所以直接对整个矩阵做平均而不改变计算结果。这种做法可以是程序更加简洁。
回归的损失函数
回归问题解决的是对具体数值的预测,例如房价、股票。这些问题预测的不是一个事先定义好的类别,而是任意实数。回归问题的神经网络一般只有一个输出节点,这个节点的输出值就是预测值。
回归问题常见的损失函数是均方误差(MSE,Mean squared error)。
其中
Tensorflow事先的MSE函数为:
mse = tf.reduce_mean(tf.square(y_ - y))
- Tensorflow学习笔记-softmax、cross_entroy
- Tensorflow学习笔记(3)-mnist(softmax regression)
- Tensorflow之softmax学习
- TensorFlow学习笔记(2)----Softmax Regression分类MNIST
- TensorFlow学习笔记(一):手写数字识别之softmax回归
- [TensorFlow学习笔记2]构建训练softmax分类器
- Tensorflow深度学习之softmax
- Softmax学习笔记
- 深度学习笔记----softmax
- TensorFlow Softmax
- Tensorflow实战学习(十)【softmax分类】
- TensorFlow学习笔记(1):使用softmax对手写体数字(MNIST数据集)进行识别
- TensorFlow学习笔记(3)--实现Softmax逻辑回归识别手写数字(MNIST数据集)
- TensorFlow学习笔记(二)——实例Softmax Regression识别手写数字
- 学习笔记TF024:TensorFlow实现Softmax Regression(回归)识别手写数字
- TensorFlow学习笔记之tf.nn.softmax()与tf.nn.softmax_cross_entropy_with_logits的用法
- 学习笔记TF010:softmax分类
- TensorFlow softmax VS sparse softmax
- Mysql日常使用记录 2017-11-23
- 如何在ie8中添加事件句柄?
- 2.Java核心API---泛型
- springBoot Restfull 常用注解
- sorted函数的理解
- Tensorflow学习笔记-softmax、cross_entroy
- SSL双向认证的认证模式设置问题
- Openresty最佳案例 | 第8篇:RBAC介绍、sql和redis模块工具类
- eclipse安装JAVA反编译插件
- Android Activity返回键控制的两种方式
- json+underscore+Node 小例子
- Visual Stdio 2015打包安装项目的方法(使用Visual Studio Installer)
- HDFS工作原理
- Servlet过滤器Filter和监听器