テンソルフローでは別の損失関数を試しています。テンソルフローにおける損失関数(if-elseを使用)
私が欲しい損失関数は、(これは要素ごとである)イプシロン小文字を区別しない関数の一種である:
if(|yData-yModel|<epsilon):
loss=0
else
loss=|yData-yModel|
私は、このソリューションを試してみました:
yData=tf.placeholder("float",[None,numberOutputs])
yModel=model(...
epsilon=0.2
epsilonTensor=epsilon*tf.ones_like(yData)
loss=tf.maximum(tf.abs(yData-yModel)-epsilonTensor,tf.zeros_like(yData))
optimizer = tf.train.GradientDescentOptimizer(0.25)
train = optimizer.minimize(loss)
私も
optimizer = tf.train.MomentumOptimizer(0.001,0.9)
を使用しました
実装でエラーは見つかりませんでした。しかし、損失= tf.square(yData-yModel)は収束し、損失= tf.maximum(tf.square(yData-yModel)-epsilonTensor、tf.zeros_like(yData))も収束する間、収束しない。
私はまた、より単純な損失= tf.abs(yData-yModel)を試みましたが、それも収束しません。私は何か間違いを犯しているのですか、あるいはゼロで何か他の点でABSの差別化できないことに問題がありますか? abs関数で何が起こっていますか?
上記玩具の問題に実装する方法(3)損失がベクトルであるのか? – colinfang
私はそれが(tf.square(yData-yModel)のように)だと思います。しかし、backpropagationアルゴリズムは出力errosの合計を最小化するので、tensorflowはそれに対処しなければなりません! – DanielTheRocketMan
「収束しない」とはどういう意味ですか?損失は安定していませんか?それともあなたが手に入れたいモデルを手に入れていないのですか? – lejlot