[英]Neural Networks : designing Cost function “not differentiable” / Tensorflow
我正在測試帶有回歸問題的Tensorflow框架。 我的輸入有很多功能,而我的輸出只有一個。 目前,它正在運行,但是我認為我的Cost函數不能滿足我的要求,因此准確性很低。
我的目標是在實際輸出的10%范圍內預測輸出,也就是說,對每個輸出:
if (y_actual - y_predicted) < 0.1 * y_actual :
cost = 0
else :
cost = 1
因此,對於預測輸出向量: [130, 35, 65, 43]
與實際輸出向量[125, 10, 75, 40]
,我應該得到2的成本。(130和40在10% ,而不是35和65)
現在,我使用平方差。
cost = tf.reduce_sum(tf.squared_difference(y_predicted,y_)/(2*nb_batches))
因此,實際上,我對輸出的總和獲得了很好的預測,但是如果我認為預測在實際輸出的10%內是准確的,則我只有60%的准確度。 我的准確性是這樣寫的:
with tf.name_scope('accuracy'):
with tf.name_scope('correct_prediction'):
correct_prediction = tf.less_equal(tf.abs((y_predicted-y_)), 0.1*tf.abs((y_))) # True if y_diff <= 10% * y_actual
with tf.name_scope('accuracy'):
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) # count 1 if correct prediction is True ; else False ; Do the sum on all the data tested
tf.scalar_summary('accuracy', accuracy)
我嘗試編寫其他成本函數,例如:
cost = tf.reduce_sum(tf.cast((tf.greater_equal(tf.abs((y_predicted-y_)), 0.1*tf.abs(y_))),tf.float32)
但是我得到一個錯誤: No gradients provided for any variable
。 我認為這是因為我們無法獲得tf.cast
的派生tf.cast
。
是否有編寫適合我需求的損失函數的正確方法? 我知道我想要的損失函數不是“可導數”。 您是否認為將其轉換為可派生函數將是一種解決方案?
我不確定我是否很清楚...
謝謝你的幫助 !
保羅
除了使用比較運算符,您還可以使用
tf.nn.relu(tf.abs(y_predicted-y_)-tf.abs(y_))
得到一個可微分的成本函數
relu操作計算max(0,x),因此將提供您正在做的連續版本。 主要區別在於,由於您距離更遠,您將受到更大的懲罰,因此您沒有二進制屬性(但這通常是回歸目標)。
這將產生比平方損失更好的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.