[Tensorflow学习系列]Tensorflow学习三 :对于Tensorflow的损失函数的理论+代码理解

[Tensorflow学习系列]Tensorflow学习三 :对于Tensorflow的损失函数的理论+代码理解#


本文是Tensorflow学习系列之第三篇

在逻辑回归问题中,我们更多的用到MSE(均方差损失函数)。因为在回归问题中的返回值,通常是单个值,并非向量。具体公式如下:

[公式]

其中 y i y_i yi是目标值, y i y_i yi^是预测值。

由此衍生了一些其他loss公式。

如均方根误差(RMSE)

[公式]

平均误差(MAE :Mean Absolute Error)

[公式]

标准差(SD :standard Deviation)

在这里插入图片描述
在这里插入图片描述

闲话少说,代码实现:

import tensorflow as tf
import numpy as np
a=tf.constant([[4.0,4.0,4.0], [3.0, 3.0, 3.0], [1.0, 1.0, 1.0]])
b=tf.constant([[1.0, 1.0, 1.0], [1.0, 1.0, 1.0], [2.0, 2.0, 2.0]])
c=tf.square(a - b)#对a矩阵减b矩阵后取方差
#求平均值tf.reduce_mean(input_tensor, reduction_indices=None, keep_dims=False, name=None)
mse=tf.reduce_mean(c)#均值
init=tf.global_variables_initializer()
if __name__ == '__main__':
    with tf.Session() as sess:
        sess.run(init)
        print(sess.run(a))
        print(sess.run(b))
        print(sess.run(c))
        print(sess.run(mse))

得到如下结果
在这里插入图片描述
这里c=tf.square(a - b)是对a矩阵减b矩阵后取方差
tf.reduce_mean函数:tf.reduce_mean(input_tensor, reduction_indices=None, keep_dims=False, name=None)这里着提一下, reduction_indices是值对哪个维度求解,默认情况下是对所有元素求解,指定第二个参数为0,则第一维的元素取平均值,即每一列求平均值,指定第二个参数为1,则第二维的元素取平均值,即每一行求平均值。
如mse=tf.reduce_mean(c,0)时则输出[4.6666665 4.6666665 4.6666665]

交叉熵(crossentropy)

交叉熵是分类问题中使用比较广的一种损失函数,刻画了两个概率分布之间的距离。
在这里插入图片描述
交叉熵刻画的是两个概率分布之间的距离,然而神经网络的输出却不一定是一个概率分布。Softmax回归就是一个非常常用的方法,用来将神经网络前向传播得到的结果变成概率分布。

交叉熵刻画的是通过概率分布q来表达概率分布p的困难程度。因为正确答案是希望得到的结果,所以当交叉熵作为神经网络的损失函数时,p代表的是正确答案,q代表的是预测值。

交叉熵刻画的是两个概率分布的距离,也就是说交叉熵值越小, 两个概率分布越接近。

假设有一个分类问题,某个样例的正确答案是(1,0,0)。某模型经过Softmax回归之后的预测答案是(0.5,0.4,0.1),那么这个预测和正确答案之间的交叉熵为:
在这里插入图片描述
如果另外一个模型的预测是(0.8,0.1 ,0.1),那么这个预测值和真实值之间的交叉熵是:
在这里插入图片描述

从直观上可以很容易地知道第二个预测答案要优于第一个 。

import tensorflow as tf
 
y_ = tf.constant([[1.0, 0, 0]]) # 正确标签
y1 = tf.constant([[0.9, 0.06, 0.04]]) # 预测结果1
y2 = tf.constant([[0.5, 0.3, 0.2]]) # 预测结果2
# 以下为未经过Softmax处理的类别得分
y3 = tf.constant([[10.0, 3.0, 2.0]])
y4 = tf.constant([[5.0, 3.0, 1.0]])
 
# 自定义交叉熵
cross_entropy1 = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y1, 1e-10, 1.0)))
cross_entropy2 = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y2, 1e-10, 1.0)))
# TensorFlow提供的集成交叉熵
# 注:该操作应该施加在未经过Softmax处理的logits上,否则会产生错误结果
# labels为期望输出,且必须采用labels=y_, logits=y的形式将参数传入
cross_entropy_v2_1 = tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y3)
cross_entropy_v2_2 = tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y4)
 
sess = tf.InteractiveSession()
print('[[0.9, 0.06, 0.04]]:', cross_entropy1.eval())
print('[[0.5, 0.3, 0.2]]:', cross_entropy2.eval())
print('v2_1', cross_entropy_v2_1.eval())
print('v2_2',cross_entropy_v2_2.eval())
sess.close()
 
'''
[[0.9, 0.06, 0.04]]: 0.0351202
[[0.5, 0.3, 0.2]]: 0.231049
v2_1 [ 0.00124651]
v2_2 [ 0.1429317]
'''

例子中出现了eval()函数,其和sess.run()这其中最主要的区别就在于你可以使用sess.run()在同一步获取多个tensor中的值,而它不能。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值