2016-07-20 7 views
5

私は外れ値で時々騒がしい非常に騒々しいデータを扱っていますので、私は自分のNNの正確さの尺度として相関を中心にしています。Rank CorrelationをTensorFlowのコスト関数として使用できますか?

順位相関(スピアマン相関係数)を自分のコスト関数として明示的に使用することはできますか?これまでは、MSEのほとんどを相関のプロキシとして使用してきました。

私は今3つの大きな障害ブロックを有する:

1)のランキングの概念はミニバッチでかなりあいまいになります。

2)どのようにランキングを動的に実行しますか? TensorFlowに勾配エラーがないか、重量/バイアスの変化がコストにどのような影響を与えるかを追跡できませんか?

3)実行時に見ているテンソルの大きさをどのように決定しますか?

例えば、以下のコードは、単に相関を使用する場合におおまかにしたいものです。実際には、実行時に決定するのではなく、長さを渡す必要があります。ここで

length = tf.shape(x)[1] ## Example code. This line not meant to work. 

original_loss = -1 * length * tf.reduce_sum(tf.mul(x, y)) - (tf.reduce_sum(x) * tf.reduce_sum(y)) 
divisor = tf.sqrt(
    (length * tf.reduce_sum(tf.square(x)) - tf.square(tf.reduce_sum(x))) * 
    (length * tf.reduce_sum(tf.square(y)) - tf.square(tf.reduce_sum(y))) 
) 
original_loss = tf.truediv(original_loss, divisor) 

答えて

1

は、スピアマンの相関のためのコードです:

predictions_rank = tf.nn.top_k(predictions_batch, k=samples, sorted=True, name='prediction_rank').indices 
real_rank = tf.nn.top_k(real_outputs_batch, k=samples, sorted=True, name='real_rank').indices 
rank_diffs = predictions_rank - real_rank 
rank_diffs_squared_sum = tf.reduce_sum(rank_diffs * rank_diffs) 
six = tf.constant(6) 
one = tf.constant(1.0) 
numerator = tf.cast(six * rank_diffs_squared_sum, dtype=tf.float32) 
divider = tf.cast(samples * samples * samples - samples, dtype=tf.float32) 
spearman_batch = one - numerator/divider 

スピアマン相関の問題点は、ソートアルゴリズム(私のコードでtop_k)を使用する必要があるということです。それを損失価値に変換する方法はありません。ソートアルゴリズムの導出はありません。あなたは通常の相関関係を使用することができますが、平均平方誤差を使用するには数学的に差はないと思います。

私はイメージのためにこれを今作業中です。私が損失関数にランキングを追加するために使用する論文で読んだことは、2つまたは3つの画像を比較することです(私が言う画像では、ランク付けしたいものを何でも言うことができます)。 Nは素子の総数であり、マージン値をα

enter image description here

enter image description here

:2つの要素を比較

enter image description here

しかし、あなたも、この方程式に:私はPhoto Aesthetics Ranking Network with Attributes and Content Adaptationまた、あなたは別のものと別のものと同様の順位でそれらのうちの2つを比較する3 elemensと損失を使用することができます

からこの式を得ましたランキングの方向を追加する必要があります。詳細はWill People Like Your Image?です。この論文の場合、実際の価値の代わりにベクターエンコーディングを使用していますが、あなたは数字だけでもそれを行うことができます。

画像の場合、画像間の比較は、それらの画像が関連している場合に意味があります。したがって、クラスタリングアルゴリズムを実行して(おそらくは)10個のクラスタを作成することをお勧めします。したがって、同じクラスタの要素を使用して、非常に異なるものではなく比較を行うことができます。これは、入力としてネットワークが何らかの形で関連しており、完全に異なるわけではありません。

最終的なランク順またはランク値であれば、さらに重要なことを知っておく必要があります。それが平均二乗誤差で行かなければならない値なら、あなたが前に書いた損失を使用することができます。あるいはそれらを組み合わせることもできます。

実行時に見ているテンソルのサイズをどのように決定しますか?

tf.shape(tensor)は、テンソルを返します。次に、tf.gather(tensor,index)を使用して必要な値を取得できます。

+0

私はSpearman Correlationsを評価基準として使用する画像評価ネットワークを再現しようとしています。 Spearman Correlationをミニバッチに対して実行することは意味がありますか?もしそうなら、結果を集約して最終的な数値を得るにはどうすればよいですか? – michael

+0

@michael私はミニバッチから完全なデータセットに非常に異なる結果を得ます。それは、最終的な価値についてではなく、傾向についてのいくつかの洞察を与えるかもしれません。ミニバッチの結果を集計して最終的なものを計算することはできません。データセット全体で行う必要があります(これは通常のPythonコードを使用しています)。 – jorgemf

+0

これは私の推測でしたが、私はこのトピックの専門家ではありません。ありがとう。 – michael

関連する問題