2016-11-04 16 views
0

私は、本質的に区分されている、tensorflowにこのような何かカスタム費用関数を定義する必要があります正確にどのように私はtf.py_funcが存在することを承知していますが、私はわからないよTensorflowカスタム区分的費用関数

def f1(a,b): 
    pass #Will do Calculation on a and b 
def f2(a,b): 
    pass #Will do Calculation on a and b 

def customCostFunction(calculated,target): 
    if(target > 0): #Trivial Criteria 
     return f1(calculated,target) 
    else: 
     return f2(calculated,target) 

を上記の場合に使用してください。本質的には、各テンソル(予測対目標)の各値について、私は予測値と目標値を私が定義した関数に渡す必要があります。これは渡された値によって若干異なる結果を返します2つの厳密に異なる学習事例)。

そして、トレーニングステップは次のように定義されます。

train = tf.train.AdamOptimizer(learning_rate = LEARNING_RATE).minimize(tf.reduce_sum(customCostFunction(model,targets),0)) 

答えて

0

私はあなたがtf.Variableあるテンソルcalculated_valuesを持っていることを、ここで仮定し、tf.placeholderあるtarget_valuesです。 (両方のベクトルが同じ次元を有する)。代わりにノード操作にあなたの費用関数をラップするのは、なぜあなたは、単に行わない:concat_bothがあるとき

bool_tensor = tf.greater(target, tf.zeros_as(target)) 
concat_both = tf.concat(1, [calculated_values, target_values]) 
required_cost_tensor = tf.select(bool_tensor, tf.map_fn(f1, concat_both), tf.map_fn(f2, concat_both)) 
tf.reduce_sum(required_cost_tensor, 0) 

をあなたが買ってあげるのタイプを可能にするためにあなたのf1f2機能ビットを編集する必要がありますmap_fn

によってアンパックは、私はちょうど自分自身tensorflowで出始めている、と私は前にtf.py_funcを使ったことがないので、これは最も最適なソリューションではないかもしれません。

+0

はいいいえ、あなたの前提は正しいです。両方とも同じ次元。 1つはプレースホルダ、もう1つは可変です。 –

+0

もしあなたが簡単な条件のためにブールテンソルを作ることができれば、それを使って 'tf.map_fn(f1、concat_both)'と 'tf.map_fn(f1、concat_both)'から要素を選択してください。 。あなたの '(計算された、ターゲットとなる)'タプルのそれぞれが 'f1'と' f2'の両方を通過するので、これは少し最適ではありません –

+0

動作しません。不平を言うf1は2つの位置的な引数を必要としますが、1つのみ与えます。 –

関連する問題