tensorflow2.0自定义损失函数,tensorflow loss不下降

  tensorflow2.0自定义损失函数,tensorflow loss不下降

  本文主要介绍python人工智能tensorflowf的常见损失函数的总结。有需要的朋友可以参考一下,希望能有所帮助。祝大家进步很大,早日升职加薪。

  00-1010前言公式1均方误差函数2交叉熵函数tensorflow中损失函数的表达式1均方误差函数2交叉熵函数示例1均方误差函数2交叉熵函数

  

目录

  损失函数在机器学习中用于表示预测值和真实值之间的差异。

  一般来说,大多数机器学习模型都会通过一定的优化器来降低损失函数,从而对机器学习模型的参数进行优化和预测。

  哦,损失函数是如此的必要,那么什么损失函数存在呢?

  常用的损失函数有均值方差函数和交叉熵函数。

  

前言

  

运算公式

  均值方差函数主要用于评价回归模型的应用效果。它的概念比较简单,就是真实值与预测值之差的平方的平均值。具体计算公式可以表示如下:

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

  

1 均方差函数

  来自信息论中的一个概念,原意是估计平均编码长度。在机器学习领域,它经常被用作分类问题的损失函数。

  交叉熵函数是如何工作的?假设在分类问题中,预测对象只有是或否,而预测值往往不是1或0,通常的做法是将大于0.5的预测结果视为1,小于0.5的预测结果视为0。

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

  计算结果会远远小于0,取符号后会远远大于0,导致模型的损失函数巨大。通过降低交叉熵函数,可以大大提高模型的预测精度。

  

2 交叉熵函数

  

tensorflow中损失函数的表达

  loss=TF . reduce _ mean(TF . square(logits-labels))

  loss=TF . reduce _ mean(TF . square(TF sub(logits,labels)))

  loss=TF . loss . mean _ squared _ error(逻辑,标注)

  

1 均方差函数

  loss=TF . nn . sigmoid _ cross _ entropy _ with _ logits(labels=y,logits=logits)

  #计算方法:先用sigmoid函数计算输入logits,再计算它们的交叉熵。

  #但它优化了交叉熵的计算方法,使结果不会溢出。

  loss=TF . nn . soft max _ cross _ entropy _ with _ logits(labels=y,logits=logits)

  #计算方法:先用softmax函数计算输入logits,再计算它们的交叉熵。

  #但它优化了交叉熵的计算方法,使结果不会溢出。

  

2 交叉熵函数

  

例子

  这是一个线性函数拟合的例子。三个失去的意思是一样的。

  将numpy作为np导入

  将张量流作为tf导入

  X _ data=np.random.rand (100)。astype (np.float32) #获取随机x值

  Y_data=x_data * 0.1 0.3 #计算对应的Y值

  重量=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:

   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。

  

  以上就是python人工智能tensorflowf常见损失函数LOSS汇总的详细内容,更多关于tensorflowf损失函数LOSS的资料请关注盛行IT软件开发工作室其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: