1. 程式人生 > 程式設計 >tensorflow 自定義損失函式示例程式碼

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,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 自定義損失函式示例,希望對大家有所幫助!