tensorflow 自定义损失函数示例代码
这个自定义损失函数的背景:(一般回归用的损失函数是MSE,但要看实际遇到的情况而有所改变)
我们现在想要做一个回归,来预估某个商品的销量,现在我们知道,一件商品的成本是1元,售价是10元。
如果我们用均方差来算的话,如果预估多一个,则损失一块钱,预估少一个,则损失9元钱(少赚的)。
显然,我宁愿预估多了,也不想预估少了。
所以,我们就自己定义一个损失函数,用来分段地看,当yhat比y大时怎么样,当yhat比y小时怎么样。
(yhat沿用吴恩达课堂中的叫法)
importtensorflowastf fromnumpy.randomimportRandomState 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)inX] withtf.Session()assess: init=tf.global_variables_initializer() sess.run(init) steps=5000 foriinrange(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自定义损失函数示例,希望对大家有所帮助!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。