tensorflow 自定义损失函数示例代码

 更新时间:2020年02月05日 10:32:15   作者:陈阔  
这篇文章主要介绍了tensorflow 自定义损失函数示例,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

这个自定义损失函数的背景:(一般回归用的损失函数是MSE, 但要看实际遇到的情况而有所改变)

我们现在想要做一个回归,来预估某个商品的销量,现在我们知道,一件商品的成本是1元,售价是10元。

如果我们用均方差来算的话,如果预估多一个,则损失一块钱,预估少一个,则损失9元钱(少赚的)。

显然,我宁愿预估多了,也不想预估少了。

所以,我们就自己定义一个损失函数,用来分段地看,当yhat 比 y大时怎么样,当yhat比y小时怎么样。

(yhat沿用吴恩达课堂中的叫法)

import tensorflow as tf
from numpy.random import RandomState
batch_size = 8
# 两个输入节点
x = tf.placeholder(tf.float32, shape=(None, 2), name="x-input")
# 回归问题一般只有一个输出节点
y_ = tf.placeholder(tf.float32, shape=(None, 1), name="y-input")
# 定义了一个单层的神经网络前向传播的过程,这里就是简单加权和
w1 = tf.Variable(tf.random_normal([2, 1], stddev=1, seed=1))
y = tf.matmul(x, w1)
# 定义预测多了和预测少了的成本
loss_less = 10
loss_more = 1
#在windows下,下面用这个where替代,因为调用tf.select会报错
loss = tf.reduce_sum(tf.where(tf.greater(y, y_), (y - y_)*loss_more, (y_-y)*loss_less))
train_step = tf.train.AdamOptimizer(0.001).minimize(loss)
#通过随机数生成一个模拟数据集
rdm = RandomState(1)
dataset_size = 128
X = rdm.rand(dataset_size, 2)
"""
设置回归的正确值为两个输入的和加上一个随机量,之所以要加上一个随机量是
为了加入不可预测的噪音,否则不同损失函数的意义就不大了,因为不同损失函数
都会在能完全预测正确的时候最低。一般来说,噪音为一个均值为0的小量,所以
这里的噪音设置为-0.05, 0.05的随机数。
"""
Y = [[x1 + x2 + rdm.rand()/10.0-0.05] for (x1, x2) in X]
with tf.Session() as sess:
 init = tf.global_variables_initializer()
 sess.run(init)
 steps = 5000
 for i in range(steps):
  start = (i * batch_size) % dataset_size
  end = min(start + batch_size, dataset_size)
  sess.run(train_step, feed_dict={x:X[start:end], y_:Y[start:end]})
 print(sess.run(w1))

[[ 1.01934695]
[ 1.04280889]

最终结果如上面所示。

因为我们当初生成训练数据的时候,y是x1 + x2,所以回归结果应该是1,1才对。
但是,由于我们加了自己定义的损失函数,所以,倾向于预估多一点。

如果,我们将loss_less和loss_more对调,我们看一下结果:

[[ 0.95525807]
[ 0.9813394 ]]

通过这个例子,我们可以看出,对于相同的神经网络,不同的损失函数会对训练出来的模型产生重要的影响。

引用:以上实例为《Tensorflow实战 Google深度学习框架》中提供。

总结

以上所述是小编给大家介绍的tensorflow 自定义损失函数示例,希望对大家有所帮助!

相关文章

  • python学习之hook钩子的原理和使用

    python学习之hook钩子的原理和使用

    这篇文章主要为大家详细介绍了python学习之hook钩子的原理和使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • python 爬取英雄联盟皮肤并下载的示例

    python 爬取英雄联盟皮肤并下载的示例

    这篇文章主要介绍了python 爬取英雄联盟皮肤并下载的示例,帮助大家更好的理解和学习使用python 爬虫,感兴趣的朋友可以聊继续
    2020-12-12
  • python常用的魔法方法(双下划线)

    python常用的魔法方法(双下划线)

    本文介绍一下python中常用的魔法方法以及面向对象中非常重要的单例模式。具有一定的参考价值,感兴趣的可以了解一下
    2021-09-09
  • Python 数据可视化超详细讲解折线图的实现

    Python 数据可视化超详细讲解折线图的实现

    数据可以帮助我们描述这个世界、阐释自己的想法和展示自己的成果,但如果只有单调乏味的文本和数字,我们却往往能难抓住观众的眼球。而很多时候,一张漂亮的可视化图表就足以胜过千言万语,让我们来用Python实现一个可视化的折线图
    2022-03-03
  • 一文教会你使用Python来下一场雪

    一文教会你使用Python来下一场雪

    这篇文章主要给大家介绍了关于使用Python来下一场雪的相关资料,文章描述了大雪缓缓下落的场景,并提供了完整的代码示例,对大家学习或者使用python具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-11-11
  • 在win10和linux上分别安装Python虚拟环境的方法步骤

    在win10和linux上分别安装Python虚拟环境的方法步骤

    这篇文章主要介绍了在win10和linux上分别安装Python虚拟环境的方法步骤,虚机环境有非常多的优点,今天我们用的虚拟环境是virtualenv。感兴趣的小伙伴们可以参考一下
    2019-05-05
  • 进一步探究Python中的正则表达式

    进一步探究Python中的正则表达式

    这篇文章主要介绍了Python中的正则表达式的一些用法,正则表达式的使用是Python学习进阶中的重要知识,需要的朋友可以参考下
    2015-04-04
  • Python-OpenCV实战:利用 KNN 算法识别手写数字

    Python-OpenCV实战:利用 KNN 算法识别手写数字

    K-最近邻(KNN)是监督学习中最简单的算法之一,KNN可用于分类和回归问题。本文将为大家介绍的是通过KNN算法实现识别手写数字。文中的示例代码介绍详细,需要的朋友可以参考一下
    2021-12-12
  • python-docx如何删除所有bookmarks

    python-docx如何删除所有bookmarks

    在Python-docx库中,虽然没有直接删除书签的功能,但可以通过操作XML元素,遍历文档结构并删除指定元素来实现删除所有书签的目的,首先要明白书签在XML文件中的位置,然后利用Python-docx提供的element元素遍历并删除特定的书签元素
    2024-09-09
  • Python图像处理之图像的读取、显示与保存操作【测试可用】

    Python图像处理之图像的读取、显示与保存操作【测试可用】

    这篇文章主要介绍了Python图像处理之图像的读取、显示与保存操作,结合实例形式分析了Python使用PIL模块、scipy和matplotlib模块进行图像读写、显示等相关操作技巧,需要的朋友可以参考下
    2019-01-01

最新评论