Tensorflow学习笔记-softmax、cross_entroy

来源:互联网 发布:百度足球大数据预测 编辑:程序博客网 时间:2024/06/08 11:15

Tensorflow学习笔记-softmax_cross_entropy_with_logits

  神经网络模型的效果和优化的目标都是通过损失函数(loss function)来定义的。无论是分类问题还是回归问题都是遇见损失函数。

分类的损失函数

  但是在分类问题中,如果评价输出结果的准确性呢?常用的方法是使用交差熵(cross entropy),它刻画了两个概率分布之间的距离,它是分类问题中使用比较广的损失函数。
  

H(y,y)=xy(x)log(y)

   y是样本的正确结果,y’是经过神经网络的输出结果。
  而损失函数一般都会配合softmax回归一起使用,而什么是softmax回归呢?
  注意:交差熵定义的两个概率分布的距离,但是神经网络的输出却不是概率分布。因此需要将网络的输出结果转化为概率分布,因此需要将神经网络输出层后在加上一个softmax层,将神经网络的输出变成一个概率分布。
  softmax层
  神经网络经过softmax层输出的概率分布为:
   softmax的公式是:
softmax(x)i=exp(x)inj=1exp(xj)

  此时就可以可以使用交差熵来评估输入数据经过神经网络处理后得到的输出结果y’与正确结果y的距离,距离越小,代表我们设计的神经网络效果越好。
  例如有一个三分类问题,某个样本的正确答案为[1,0,0],某个模型经过softmax回归的预测结果为(0.5,0.4,0.1),那么它和正确结果的交差熵为:
H((1,0,0),(0.5,0.4,0.1))=(1log(0.5)+0log(0.4)+0log(0.1))=0.3

  但另外一个模型的输出结果为(0.8,0.1,0.1),则预测值与真实值的交差熵为:
H((1,0,0),(0.8,0.1,0.1))=(1log(0.8)+0log(0.1)+0log(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)。

MSE(y,y)=ni=1(yiyi)2n

  其中yi为batch中第i个数据的正确答案,而yi为神经网络输出的预测值。
  Tensorflow事先的MSE函数为:

mse = tf.reduce_mean(tf.square(y_ - y))
阅读全文
0 0
原创粉丝点击