tensorflow 自定義損失函數(shù)示例代碼
這個(gè)自定義損失函數(shù)的背景:(一般回歸用的損失函數(shù)是MSE, 但要看實(shí)際遇到的情況而有所改變)
我們現(xiàn)在想要做一個(gè)回歸,來(lái)預(yù)估某個(gè)商品的銷(xiāo)量,現(xiàn)在我們知道,一件商品的成本是1元,售價(jià)是10元。
如果我們用均方差來(lái)算的話,如果預(yù)估多一個(gè),則損失一塊錢(qián),預(yù)估少一個(gè),則損失9元錢(qián)(少賺的)。
顯然,我寧愿預(yù)估多了,也不想預(yù)估少了。
所以,我們就自己定義一個(gè)損失函數(shù),用來(lái)分段地看,當(dāng)yhat 比 y大時(shí)怎么樣,當(dāng)yhat比y小時(shí)怎么樣。
(yhat沿用吳恩達(dá)課堂中的叫法)
import tensorflow as tf
from numpy.random import RandomState
batch_size = 8
# 兩個(gè)輸入節(jié)點(diǎn)
x = tf.placeholder(tf.float32, shape=(None, 2), name="x-input")
# 回歸問(wèn)題一般只有一個(gè)輸出節(jié)點(diǎn)
y_ = tf.placeholder(tf.float32, shape=(None, 1), name="y-input")
# 定義了一個(gè)單層的神經(jīng)網(wǎng)絡(luò)前向傳播的過(guò)程,這里就是簡(jiǎn)單加權(quán)和
w1 = tf.Variable(tf.random_normal([2, 1], stddev=1, seed=1))
y = tf.matmul(x, w1)
# 定義預(yù)測(cè)多了和預(yù)測(cè)少了的成本
loss_less = 10
loss_more = 1
#在windows下,下面用這個(gè)where替代,因?yàn)檎{(diào)用tf.select會(huì)報(bào)錯(cuò)
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)
#通過(guò)隨機(jī)數(shù)生成一個(gè)模擬數(shù)據(jù)集
rdm = RandomState(1)
dataset_size = 128
X = rdm.rand(dataset_size, 2)
"""
設(shè)置回歸的正確值為兩個(gè)輸入的和加上一個(gè)隨機(jī)量,之所以要加上一個(gè)隨機(jī)量是
為了加入不可預(yù)測(cè)的噪音,否則不同損失函數(shù)的意義就不大了,因?yàn)椴煌瑩p失函數(shù)
都會(huì)在能完全預(yù)測(cè)正確的時(shí)候最低。一般來(lái)說(shuō),噪音為一個(gè)均值為0的小量,所以
這里的噪音設(shè)置為-0.05, 0.05的隨機(jī)數(shù)。
"""
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]
最終結(jié)果如上面所示。
因?yàn)槲覀儺?dāng)初生成訓(xùn)練數(shù)據(jù)的時(shí)候,y是x1 + x2,所以回歸結(jié)果應(yīng)該是1,1才對(duì)。
但是,由于我們加了自己定義的損失函數(shù),所以,傾向于預(yù)估多一點(diǎn)。
如果,我們將loss_less和loss_more對(duì)調(diào),我們看一下結(jié)果:
[[ 0.95525807]
[ 0.9813394 ]]
通過(guò)這個(gè)例子,我們可以看出,對(duì)于相同的神經(jīng)網(wǎng)絡(luò),不同的損失函數(shù)會(huì)對(duì)訓(xùn)練出來(lái)的模型產(chǎn)生重要的影響。
引用:以上實(shí)例為《Tensorflow實(shí)戰(zhàn) Google深度學(xué)習(xí)框架》中提供。
總結(jié)
以上所述是小編給大家介紹的tensorflow 自定義損失函數(shù)示例,希望對(duì)大家有所幫助!
相關(guān)文章
python學(xué)習(xí)之hook鉤子的原理和使用
這篇文章主要為大家詳細(xì)介紹了python學(xué)習(xí)之hook鉤子的原理和使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10
Python?數(shù)據(jù)可視化超詳細(xì)講解折線圖的實(shí)現(xiàn)
數(shù)據(jù)可以幫助我們描述這個(gè)世界、闡釋自己的想法和展示自己的成果,但如果只有單調(diào)乏味的文本和數(shù)字,我們卻往往能難抓住觀眾的眼球。而很多時(shí)候,一張漂亮的可視化圖表就足以勝過(guò)千言萬(wàn)語(yǔ),讓我們來(lái)用Python實(shí)現(xiàn)一個(gè)可視化的折線圖2022-03-03
一文教會(huì)你使用Python來(lái)下一場(chǎng)雪
這篇文章主要給大家介紹了關(guān)于使用Python來(lái)下一場(chǎng)雪的相關(guān)資料,文章描述了大雪緩緩下落的場(chǎng)景,并提供了完整的代碼示例,對(duì)大家學(xué)習(xí)或者使用python具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-11-11
在win10和linux上分別安裝Python虛擬環(huán)境的方法步驟
這篇文章主要介紹了在win10和linux上分別安裝Python虛擬環(huán)境的方法步驟,虛機(jī)環(huán)境有非常多的優(yōu)點(diǎn),今天我們用的虛擬環(huán)境是virtualenv。感興趣的小伙伴們可以參考一下2019-05-05
Python-OpenCV實(shí)戰(zhàn):利用 KNN 算法識(shí)別手寫(xiě)數(shù)字
K-最近鄰(KNN)是監(jiān)督學(xué)習(xí)中最簡(jiǎn)單的算法之一,KNN可用于分類(lèi)和回歸問(wèn)題。本文將為大家介紹的是通過(guò)KNN算法實(shí)現(xiàn)識(shí)別手寫(xiě)數(shù)字。文中的示例代碼介紹詳細(xì),需要的朋友可以參考一下2021-12-12
Python圖像處理之圖像的讀取、顯示與保存操作【測(cè)試可用】
這篇文章主要介紹了Python圖像處理之圖像的讀取、顯示與保存操作,結(jié)合實(shí)例形式分析了Python使用PIL模塊、scipy和matplotlib模塊進(jìn)行圖像讀寫(xiě)、顯示等相關(guān)操作技巧,需要的朋友可以參考下2019-01-01

