テンソルフローバックエンドを使用してケラスのカスタム損失関数を実装しようとしています。私が取り組んでいるアイデアは、 "Signal"の "Cost"をy_trueとして提供し、シグナルをy_predとして扱うことです。これは基本的に複雑な分類の状況です。ケラスカスタム損失関数テンソル変換時の値エラー
例として、3つの出力信号とN個のサンプルがあるとすると、コスト行列はNx3になり、予測もNx3になります(y_trueとy_predに問題が発生しないように
実際の信号を選択する方法は、3つの出力値の最大値を取ることであり、この信号のコストは、対応するインデックスのコストマトリックスの値です。合計コストは、
私はこれをtensorflowで実装しました(gather_ndを使用する必要があったので、keras.backendは使用できませんでしたが、私がオンラインで読んだ例ではこのf行為)。私の実装のためのコードは次のとおりです。
def maxSignalLossTF(costs, signals):
signalChoices = tf.transpose(tf.stack((tf.to_int64(tf.range(tf.shape(signals)[0])), tf.argmax(signals, axis=1))))
signalCosts = tf.gather_nd(costs, signalChoices)
return tf.reduce_sum(signalCosts)
私はnumpyの同等と比較することによって期待されるように、この機能が働いていることが確認されています。コンパイルするとき、私は私のモデルにこの損失関数を渡しています:
model = Sequential()
model.add(Dense(250, input_shape=(trainX.shape[1],)))
model.add(Activation('relu'))
model.add(Dropout(0.1))
model.add(Dense(250))
model.add(Activation('relu'))
model.add(Dense(3))
model.add(Activation('linear'))
model.compile(optimizer='adam', loss=maxSignalLossTF)
このすべては、私がモデルに合うようにしようとするまで正常に動作するようです: model.fit(TrainX、TrainY、エポック= 100) でコンソールが、私はこのメッセージがkerasとtensorflow中から来た場所追跡しようとしたが、私はそれがどのような私のように私のために多くの洞察を得られなかった機能を発見しながら、次の役に立たないメッセージ
Traceback (most recent call last):
File "tensortest.py", line 331, in <module>
model.fit(TrainX, TrainY, epochs=100)
File "/home/myname/anaconda2/lib/python2.7/site-packages/keras/models.py", line 845, in fit
initial_epoch=initial_epoch)
File "/home/myname/anaconda2/lib/python2.7/site-packages/keras/engine/training.py", line 1457, in fit
self._make_train_function()
File "/home/myname/anaconda2/lib/python2.7/site-packages/keras/engine/training.py", line 1001, in _make_train_function
self.total_loss)
File "/home/myname/anaconda2/lib/python2.7/site-packages/keras/optimizers.py", line 398, in get_updates
m_t = (self.beta_1 * m) + (1. - self.beta_1) * g
File "/home/myname/anaconda2/lib/python2.7/site-packages/tensorflow/python/ops/math_ops.py", line 856, in binary_op_wrapper
y = ops.convert_to_tensor(y, dtype=x.dtype.base_dtype, name="y")
File "/home/myname/anaconda2/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 611, in convert_to_tensor
as_ref=False)
File "/home/myname/anaconda2/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 676, in internal_convert_to_tensor
ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref)
File "/home/myname/anaconda2/lib/python2.7/site-packages/tensorflow/python/framework/constant_op.py", line 121, in _constant_tensor_conversion_function
return constant(v, dtype=dtype, name=name)
File "/home/myname/anaconda2/lib/python2.7/site-packages/tensorflow/python/framework/constant_op.py", line 102, in constant
tensor_util.make_tensor_proto(value, dtype=dtype, shape=shape, verify_shape=verify_shape))
File "/home/myname/anaconda2/lib/python2.7/site-packages/tensorflow/python/framework/tensor_util.py", line 364, in make_tensor_proto
raise ValueError("None values not supported.")
ValueError: None values not supported.
を吐き出すその時点間違っている。私は完全に私の入力XとYには問題がなかったので、手動で計算に手動でtf.convert_to_tensor()
を使用して完全に実装されていますので、私は間違っているこの時点でかなり困惑しています。
私はKerasとtensorflowを初めて使用しています。基本的にすべての例を見てきましたが、私はその可能性が非常に高いと感じました。だから、どんな助けでも大歓迎です。事前に感謝します
また、このタイプの費用設定にあらかじめ作成された解決策がある場合は、私はそれらについて知っておきたいと思います。私はこのアイデアをいくつかの標準的なオプションを使って試してみました。その結果、さまざまな出力信号のインセンティブをより直接的に制御できるようなものを試すことにしました。他のサンプルを誤分類するほど重要)
おかげで、あなたは正しい、この機能の目的はそれだけで放出された特定の信号に関連したコストを気にということでした。私は、進化的な計算の考え方から、信号に関連するアクションの実際のコストをより正確に反映させるために、さまざまな信号を生成するコストを重視したいという問題からアプローチしていました。私はコストとシグナルの平均積の2番目の損失関数を作成しました。 'tf.reduce_sum(S/tf.reduce_sum(S、axis = 1、keep_dims = True))* costs)'これは働いていましたが、何もしませんでした。多分MLはこれのための間違ったツールですか? –
私はあなたの目標を理解しているかどうかわかりません... "どのアクションを取るべきか"(可能なアクションのサンプルの3つの要素のそれぞれ)を決定するモデルですか? –
はい。このような問題をどのように構造化し、さまざまなアクションが必ずしも結果をもたらすわけではないということを考慮に入れるようにするための提案はありますか?それとも、直感的なやり方で問題を見ていますか? –