2017-02-28 11 views
1

私はこのカスタム損失関数(y_predデータはy_trueが提供する実際の順序インデックスとコヒーレントに注文された場合、それはチェック)作品作りいくつかの問題があります:私は適切にサンプルデータとそれを実行することができますkeras loss関数でtf.nn.top_kを使用するには?

def custom_objective(y_true, y_pred): 
    y_true = tf.cast(y_true, tf.float32) 
    ordered_output = tf.cast(tf.nn.top_k(-y_pred, k=5)[1], tf.float32) 
    return tf.sqrt(tf.reduce_mean(tf.square(ordered_output - y_true), axis=-1)) 

を:

with tf.Session() as sess: 
    print(custom_objective(tf.constant([0, 1, 2, 3, 4, 5]), 
          tf.constant([0.0, 0.9, 0.2, 0.3, 0.5, 0.8])).eval()) # 1.82574 

しかし、どういうわけか、それは上げるように私は、model.compileでそれを使用する場合、それは動作しません:

/Users/luca/.virtualenvs/python3/lib/python3.6/site-packages/tensorflow/python/framework/tensor_util.py in make_tensor_proto(values, dtype, shape, verify_shape) 
    358 else: 
    359  if values is None: 
--> 360  raise ValueError("None values not supported.") 
    361  # if dtype is provided, forces numpy array to be the type 
    362  # provided if possible. 

ValueError: None values not supported. 

ordered_output = tf.cast(tf.nn.top_k(-y_pred, k=5)[1], tf.float32)ordered_output = -y_predに変更すると、トレーニングテストセットに「なし」の値がないことを覚えておいてください。モデルが正しくコンパイルされ、トレーニングが適切に開始されます(ただし、必要な損失機能はありません)。

top_kを分かりにくいとは思わないため、top_kを使用すると何か問題があるかもしれないという微妙な感情がありますが、予測された順序の違いを評価するための良いアイデアはありません。ヒント/アイデア/論文/参考資料:)

+0

は '注文データの注文データやindecesをy_true'されますか? –

+0

@MarcinMożejko秒。 yは元々秩序だったので、訓練の前にシャッフルされ、y_trueは私が予測したい順序付けされたデータのインデックスを表します。 atm私はそれを予測するためにMSEを使用することをデフォルトにしていますが、それは超効率的ではありません – luke14free

+0

希望の結果を得るために最適化するためにモデルを書き直す方法をお見せします。現在、あなたのモデルはこれをうまく行かないかもしれません。 –

答えて

2

これは私が本当にあなたのコードを修正されませんよう否決が、ここでは何も行かないかもしれない:

私はあなたが目的関数としてtop_k使用することができ、実際に、信じていません。目的関数としての精度を使用できないのと同じように。

理由は数学的です。たとえケラ、テンソルフロー、テアノフと共同でも。 AIのための素晴らしいツールであり、誰もが神経網でバイディングすることを可能にするが、lattersはまだ非常に複雑な数学的ツールのままです。これらの数学はフードの下に隠れていますが、あらかじめ作成されたツール以上のものを試すときは、それらのことを認識しておく必要があります。

ネットワークを訓練するときには、ネットワーク上の例がどれほど間違っているのかを計算し、そのエラーをバックプロパゲージして学習します。そのバックプロパゲーションの背後にあるアルゴリズムはオプティマイザです。より正確には、グラジエントベースのオプティマイザです。勾配を計算するには、最適化する関数、損失/目的関数を区別する必要があります。これは、目的は微分可能でなければならないことを意味します。精度は微分可能な関数ではなく、入力として0と1の間の実数をとり、階段状の関数を出力します。xが0の場合は0、x> 0.5の場合は0です。その関数は0.5で勾配を得ることができないため、微分できません。 top_k関数はある種の精度関数です。実際、私の考えでは、目的のために使用することはできません。なぜなら、スマートなテンソルフローは関数のグラジエントを計算しなければならないからです。

私はこれが役に立てば幸い:)

+0

Nassimの助けを借りてくれてありがとう、あなたの言うことは完璧に理にかなっていて、私が期待していたものでした。それにもかかわらず、人々は神経回路網を使って遊んでいるものを見てきました。この種の問題にはスマートなアプローチがあるのか​​疑問でした。たとえば、チェックのための「弱い」代替手段は、MSEまたはCategorical Crossentropyを使用することですが、データの順序に関するかなりの情報が失われます。 – luke14free

+0

達成しようとしていることに関する詳細情報を提供できますか?入力、ターゲットの小さな例とそれをやりたい理由は完璧です! –

関連する問題