私はこのカスタム損失関数(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
を使用すると何か問題があるかもしれないという微妙な感情がありますが、予測された順序の違いを評価するための良いアイデアはありません。ヒント/アイデア/論文/参考資料:)
は '注文データの注文データやindecesをy_true'されますか? –
@MarcinMożejko秒。 yは元々秩序だったので、訓練の前にシャッフルされ、y_trueは私が予測したい順序付けされたデータのインデックスを表します。 atm私はそれを予測するためにMSEを使用することをデフォルトにしていますが、それは超効率的ではありません – luke14free
希望の結果を得るために最適化するためにモデルを書き直す方法をお見せします。現在、あなたのモデルはこれをうまく行かないかもしれません。 –