损失函数在机器学习中用于表示预测值与真实值之间的差距。一般而言,大多数机器学习模型都会通过一定的优化器来减小损失函数从而达到优化预测机器学习模型参数的目的。

  哦豁,损失函数这么必要,那都存在什么损失函数呢?

  一般常用的损失函数是均方差函数和交叉熵函数。

  运算公式

  1 均方差函数

  均方差函数主要用于评估回归模型的使用效果,其概念相对简单,就是真实值与预测值差值的平方的均值,具体运算公式可以表达如下:

  

  其中f(xi)是预测值,yi是真实值。

  其中f(x_{i})是预测值,y_{i}是真实值。

  其中f(xi​)是预测值,yi​是真实值。在二维图像中,该函数代表每个散点到拟合曲线y轴距离的总和,非常直观。

  2 交叉熵函数

  出自信息论中的一个概念,原来的含义是用来估算平均编码长度的。在机器学习领域中,其常常作为分类问题的损失函数。

  

  其中f(xi)是预测值,yi是真实值。

  其中f(x_{i})是预测值,y_{i}是真实值。

  其中f(xi​)是预测值,yi​是真实值。交叉熵函数是怎么工作的呢?假设在分类问题中,被预测的物体只有是或者不是,预测值常常不是1或者0这样绝对的预测结果,预测是常用的做法是将预测结果中大于0.5的当作1,小于0.5的当作0。

  此时假设如果存在一个样本,预测值接近于0,实际值却是1,那么在交叉熵函数的前半部分:

  

  其运算结果会远远小于0,取符号后会远远大于0,导致该模型的损失函数巨大。通过减小交叉熵函数可以使得模型的预测精度大大提升。

  tensorflow中损失函数的表达

  1 均方差函数

  loss = tf.reduce_mean(tf.square(logits-labels))

  loss = tf.reduce_mean(tf.square(tf.sub(logits, labels)))

  loss = tf.losses.mean_squared_error(logits,labels)

  2 交叉熵函数

  loss = tf.nn.sigmoid_cross_entropy_with_logits(labels=y,logits=logits)

  #计算方式:对输入的logits先通过sigmoid函数计算,再计算它们的交叉熵

  #但是它对交叉熵的计算方式进行了优化,使得结果不至于溢出。

  loss = tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=logits)

  #计算方式:对输入的logits先通过softmax函数计算,再计算它们的交叉熵,

  #但是它对交叉熵的计算方式进行了优化,使得结果不至于溢出。

  例子

  1 均方差函数

  这是一个一次函数拟合的例子。三个loss的意义相同。

  import numpy as np

  import tensorflow as tf

  x_data = np.random.rand(100).astype(np.float32) #获取随机X值

  y_data = x_data * 0.1 + 0.3 #计算对应y值

  Weights = tf.Variable(tf.random_uniform([1],-1.0,1.0)) #random_uniform返回[m,n]大小的矩阵,产生于low和high之间,产生的值是均匀分布的。

  Biaxs = tf.Variable(tf.zeros([1])) #生成0

  y = Weights*x_data + Biaxs

  loss = tf.losses.mean_squared_error(y_data,y) #计算平方差

  #loss = tf.reduce_mean(tf.square(y_data-y))

  #loss = tf.reduce_mean(tf.square(tf.sub(y_data,y)))

  optimizer = tf.train.GradientDescentOptimizer(0.6) #梯度下降法

  train = optimizer.minimize(loss)

  init = tf.initialize_all_variables()

  sess = tf.Session()

  sess.run(init)

  for i in range(200):

  sess.run(train)

  if i % 20 == 0:

  print(sess.run(Weights),sess.run(Biaxs))

  输出结果为:

  [0.10045234] [0.29975605]

  [0.10010818] [0.2999417]

  [0.10002586] [0.29998606]

  [0.10000619] [0.29999667]

  [0.10000149] [0.2999992]

  2 交叉熵函数

  这是一个Mnist手写体识别的例子。两个loss函数都可以进行交叉熵运算,在计算loss函数的时候中间经过的函数不同。

  import tensorflow as tf

  import numpy as np

  from tensorflow.examples.tutorials.mnist import input_data

  mnist = input_data.read_data_sets("MNIST_data",one_hot = "true")

  def add_layer(inputs,in_size,out_size,n_layer,activation_function = None):

  layer_name = 'layer%s'%n_layer

  with tf.name_scope(layer_name):

  with tf.name_scope("Weights"):

  Weights = tf.Variable(tf.random_normal([in_size,out_size]),name = "Weights")

  tf.summary.histogram(layer_name+"/weights",Weights)

  with tf.name_scope("biases"):

  biases = tf.Variable(tf.zeros([1,out_size]) + 0.1,name = "biases")

  tf.summary.histogram(layer_name+"/biases",biases)

  with tf.name_scope("Wx_plus_b"):

  Wx_plus_b = tf.matmul(inputs,Weights) + biases

  tf.summary.histogram(layer_name+"/Wx_plus_b",Wx_plus_b)

  if activation_function == None :

  outputs = Wx_plus_b

  else:无锡人流费用 http://www.xasgfk120.com/

  outputs = activation_function(Wx_plus_b)

  tf.summary.histogram(layer_name+"/outputs",outputs)

  return outputs

  def compute_accuracy(x_data,y_data):

  global prediction

  y_pre = sess.run(prediction,feed_dict={xs:x_data})

  correct_prediction = tf.equal(tf.arg_max(y_data,1),tf.arg_max(y_pre,1)) #判断是否相等

  accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32)) #赋予float32数据类型,求平均。

  result = sess.run(accuracy,feed_dict = {xs:batch_xs,ys:batch_ys}) #执行

  return result

  xs = tf.placeholder(tf.float32,[None,784])

  ys = tf.placeholder(tf.float32,[None,10])

  layer1 = add_layer(xs,784,150,"layer1",activation_function = tf.nn.tanh)

  prediction = add_layer(layer1,150,10,"layer2")

  #由于loss函数在运算的时候会自动进行softmax或者sigmoid函数的运算,所以不需要特殊激励函数。

  with tf.name_scope("loss"):

  loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=ys,logits = prediction),name = 'loss')

  #loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(labels=ys,logits = prediction),name = 'loss')

  #label是标签,logits是预测值,交叉熵。

  tf.summary.scalar("loss",loss)

  train = tf.train.AdamOptimizer(4e-3).minimize(loss)

  init = tf.initialize_all_variables()

  merged = tf.summary.merge_all()

  with tf.Session() as sess:

  sess.run(init)

  write = tf.summary.FileWriter("logs/",sess.graph)

  for i in range(5001):

  batch_xs,batch_ys = mnist.train.next_batch(100)

  sess.run(train,feed_dict = {xs:batch_xs,ys:batch_ys})

  if i % 1000 == 0:

  print("训练%d次的识别率为:%f。"%((i+1),compute_accuracy(mnist.test.images,mnist.test.labels)))

  result = sess.run(merged,feed_dict={xs:batch_xs,ys:batch_ys})

  write.add_summary(result,i)

  输出结果为

  训练1次的识别率为:0.103100。

  训练1001次的识别率为:0.900700。

  训练2001次的识别率为:0.928100。

  训练3001次的识别率为:0.938900。

  训练4001次的识别率为:0.945600。

  训练5001次的识别率为:0.952100。

tf常见的损失函数(LOSS)汇总的更多相关文章

  1. 损失函数(loss function)

    通常而言,损失函数由损失项(loss term)和正则项(regularization term)组成.发现一份不错的介绍资料: http://www.ics.uci.edu/~dramanan/te ...

  2. 常见.NET功能代码汇总 (2)

    常见.NET功能代码汇总 23,获取和设置分级缓存 获取缓存:首先从本地缓存获取,如果没有,再去读取分布式缓存写缓存:同时写本地缓存和分布式缓存 private static T GetGradeCa ...

  3. IE6 浏览器常见兼容问题 大汇总(23个)

    IE6以及各个浏览器常见兼容问题 大汇总 综述:虽然说IE6在2014年4月将被停止支持,但是不得不说的是,IE6的市场并不会随着支持的停止而立刻消散下去,对于WEB前端开发工程师来说,兼容IE6 兼 ...

  4. 机器学习 损失函数(Loss/Error Function)、代价函数(Cost Function)和目标函数(Objective function)

    损失函数(Loss/Error Function): 计算单个训练集的误差,例如:欧氏距离,交叉熵,对比损失,合页损失 代价函数(Cost Function): 计算整个训练集所有损失之和的平均值 至 ...

  5. 损失函数(Loss function) 和 代价函数(Cost function)

    1损失函数和代价函数的区别: 损失函数(Loss function):指单个训练样本进行预测的结果与实际结果的误差. 代价函数(Cost function):整个训练集,所有样本误差总和(所有损失函数 ...

  6. IE6 浏览器常见兼容问题 大汇总(23个)[转载]

    IE6以及各个浏览器常见兼容问题 大汇总 综述:虽然说IE6在2014年4月将被停止支持,但是不得不说的是,IE6的市场并不会随着支持的停止而立刻消散下去,对于WEB前端开发工程师来说,兼容IE6 兼 ...

  7. 损失函数(Loss Function) -1

    http://www.ics.uci.edu/~dramanan/teaching/ics273a_winter08/lectures/lecture14.pdf Loss Function 损失函数 ...

  8. 损失函数(loss function) 转

    原文:http://luowei828.blog.163.com/blog/static/310312042013101401524824 通常而言,损失函数由损失项(loss term)和正则项(r ...

  9. leetcode常见算法与数据结构汇总

    leetcode刷题之后,很多问题老是记忆不深刻,因此特意开此帖: 一.对做过题目的总结: 二.对一些方法精妙未能领会透彻的代码汇总,进行时常学习: 三.总结面试笔试常见题目,并讨论最优解法及各种解法 ...

随机推荐

  1. PostgreSQL DISTINCT 和 DISTINCT ON

    select语句中,使用distinct关键字,在处理select list后,结果表可以选择消除重复的行.在SELECT之后直接写入DISTINCT关键字以指定此关键字: SELECT DISTIN ...

  2. 图解 https 单向认证和双向认证!

    来源: 一.Http HyperText Transfer Protocol,超文本传输协议,是互联网上使用最广泛的一种协议,所有WWW文件必须遵循的标准.HTTP协议传输的数据都是未加密的,也就是明 ...

  3. 一个流行的网页动画JS库

    animejs https://animejs.com/ Anime.js (/ˈæn.ə.meɪ/) is a lightweight JavaScript animation library wi ...

  4. java Random 抢红包算法

    红包有一个总金额和总数量,领的时候随机分配金额. 维护一个剩余总金额和总数量,分配时,如果数量等于1,直接返回总金额,如果大于1,则计算平均值,并设定随机最大值为平均值的两倍,然后取一个随机值,如果随 ...

  5. mysqldump导出完整sql脚本

    #导出某个数据库--结构+数据 shell>mysqldump -h192.168.161.124 -uroot -pxxxxxx --opt db_name |gzip -9 > /db ...

  6. CentOS7 安装Redis和PHP-redis扩展

    aemonize yes Redis是一个key-value存储系统,属于我们常说的NoSQL.它遵守BSD协议.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的AP ...

  7. C# COM组的开发以及调用

    一.用C#编写一个COM组件 1.       打开Visual Studio2008,[文件]->[新建]->[项目] 2.       项目类型=Visual C#,模版=类库,名称= ...

  8. 服务器系统启动之所以比PC慢很多

    服务器系统启动之所以比PC慢很多, 第一个是:服务器底层还有一套硬件和固件,叫做IPMI系统,这套系统需要时间来引导和载入.载入IPMI后,它才会载入BIos来继续引导.这个占主要时间,尤其是冷启动的 ...

  9. noi openjudge 1768:最大子矩阵

    链接:http://noi.openjudge.cn/ch0406/1768/ 描述已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵. 比如 ...

  10. 0-python变量及基本数据类型

    目录 1.变量2.字符串3.布尔类型4.整数5.浮点数6.日期 1.变量 1.1.变量的定义 - 类似于标签 1.2.变量的命名规则 - (强制)变量名只能包含数字.字母.下划线 - (强制)不能以数 ...