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],使用这个损失函数会尽量让预测值
离标准答案更近。通过这个样例可以看出,对于相同的神经网络,不同的损失函数会对训练得到的模型产生重要影响。