2017-10-10 4 views
0

私はテンソルフローコスト関数としてginiインデックス計算を書き留めようとしています。ジニ係数は次のとおりです。 https://en.wikipedia.org/wiki/Gini_coefficientテンソルフローのGiniインデックスを計算する

numpyのソリューションは

def ginic(actual, pred): 
    n = len(actual) 
    a_s = actual[np.argsort(pred)] 
    a_c = a_s.cumsum() 
    giniSum = a_c.sum()/a_s.sum() - (n + 1)/2.0 
    return giniSum/n 

だろう誰かが私には、例えば(TFでこれを行う方法を見つけ出す手助けすることができ、TFにAの一部にすることができ一切argsortはありませんAFAIK)

答えて

1

tf.nn.top_k()を使用すると、argsortingを実行できます。この関数はタプルを返し、2番目の要素はインデックスです。注文は降順であるため、注文は元に戻す必要があります。ここで

def ginicTF(actual:tf.Tensor,pred:tf.Tensor): 
    n = int(actual.get_shape()[-1]) 
    inds = tf.reverse(tf.nn.top_k(pred,n)[1],axis=[0]) # this is the equivalent of np.argsort 
    a_s = tf.gather(actual,inds) # this is the equivalent of numpy indexing 
    a_c = tf.cumsum(a_s) 
    giniSum = tf.reduce_sum(a_c)/tf.reduce_sum(a_s) - (n+1)/2.0 
    return giniSum/n 

は、あなたがこの機能をお使いのnumpyの機能ginicと同じ数値を返すことを検証するために使用できるコードです:

sess = tf.InteractiveSession() 
ac = tf.placeholder(shape=(50,),dtype=tf.float32) 
pr = tf.placeholder(shape=(50,),dtype=tf.float32) 
actual = np.random.normal(size=(50,)) 
pred = np.random.normal(size=(50,)) 
print('numpy version: {:.4f}'.format(ginic(actual,pred))) 
print('tensorflow version: {:.4f}'.format(ginicTF(ac,pr).eval(feed_dict={ac:actual,pr:pred}))) 
+0

損失としてNNに渡されたときに[OK]を、これはよさそうだけど機能がエラーをラインの を返す:---> 14 N = INT(actual.get_shape() - 1]) エラー:例外TypeError:\ __ INT \ __これは、非整数(タイプNoneType) を返さセッションを実行しても正常に動作します – Ilya

+0

これは、 'actual'のプレースホルダ\テンソルの形状が'(None、) 'であるため、あらかじめ定義された長さを持たないので、' n'はグラフ構造。その場合、あなたができることは、それを計算するのではなく、関数の追加引数として 'n'(配列の長さ)を渡すことだけです。 – Lior

+0

私はこれを解決できませんでした(nのデフォルト値を与えようとしましたが、これで解決できません)。私はこの特定の問題について新しい質問をしましたhttps://stackoverflow.com/questions/46674293/custom-loss-function-in-keras-how-to-deal-with-placeholders もう一度、 TFの機能! – Ilya

関連する問題