zoukankan      html  css  js  c++  java
  • tensflow自定义损失函数

     tensflow 不仅支持经典的损失函数,还可以优化任意的自定义损失函数。

     预测商品销量时,如果预测值比真实销量大,商家损失的是生产商品的成本;如果预测值比真实值小,损失的则是商品的利润。

     比如如果一个商品的成本是1元,但利润是10元,那么少预测一个就少赚9元;而多预测一个才亏1元,为了最大化利润预期,需要将损失函数和利润直接联系起来。注意损失函数

    定义的是损失,所以要将利润最大化,定义的损失函数应该刻成本或者代价。下面给出了一个当预测多于真实值和预测少于真实值时有不同损失系数和损失函数:

    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)
    logss_less=10
    logss_more=1
    # 损失函数
    logss=tf.reduce_sum(tf.where(tf.greater(y,y_), (y-y_)*logss_more, (y_-y)*logss_less)) train_step=tf.train.AdamOptimizer(0.001).minimize(logss) rdm=RandomState(1) dataset_size=128 X=rdm.rand(dataset_size,2) Y=[[x1 +x2+rdm.rand()/10.0-0.05] for (x1,x2) in X] with tf.Session() as sess: init_op=tf.global_variables_initializer() sess.run(init_op) 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.0194283]

    [1.0428752]]
    [[1.0194151]
    [1.0428821]]
    [[1.019347 ]
    [1.0428089]]

    所以预测函数的值是1.02x1+1.04x2,这要比x1+x2大,因为在损失函数中指定预测少了的损失(logss_less>loss_more.如果将log_less的值调整为1,log_more的值调整为10,

    那么结果将会如下

    ...

    [[0.95491844]
    [0.9814671 ]]
    [[0.95506585]
    [0.98148215]]
    [[0.9552581]
    [0.9813394]]

    也就是说,在这样的设置下,模型会更加偏向于预测少一点,而如果使用均方误差作为损失函数,那么w1会是[0.97437561,1.0243336],使用这个损失函数会尽量让预测值

    离标准答案更近。通过这个样例可以看出,对于相同的神经网络,不同的损失函数会对训练得到的模型产生重要影响。

  • 相关阅读:
    mysql 数据库 II(数据类型)
    mysql 数据库 I
    网络协议
    Python 类IV(类成员,异常处理等)
    Python 类III(三大特性,约束,super)
    Python 类II
    类加载机制
    Java新篇章之集合
    Java 类类型之 String 类型
    java 多态
  • 原文地址:https://www.cnblogs.com/canyangfeixue/p/9193493.html
Copyright © 2011-2022 走看看