2017-10-30 9 views
0

テンソルフローバックエンドを使用してケラスのカスタム損失関数を実装しようとしています。私が取り組んでいるアイデアは、 "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を初めて使用しています。基本的にすべての例を見てきましたが、私はその可能性が非常に高いと感じました。だから、どんな助けでも大歓迎です。事前に感謝します

また、このタイプの費用設定にあらかじめ作成された解決策がある場合は、私はそれらについて知っておきたいと思います。私はこのアイデアをいくつかの標準的なオプションを使って試してみました。その結果、さまざまな出力信号のインセンティブをより直接的に制御できるようなものを試すことにしました。他のサンプルを誤分類するほど重要)

答えて

0

これは、あなたの損失関数がモデルの重みに関して異なっていないために起こります。

"y_true"( "費用")の "定数"に基づいています。

どの信号が最大であるかを変えることで損失関数の結果を変更することは可能ですが、微分可能な関数を持たずにどの方向をとるべきかを知ることは不可能です。まず


、私はあなたの関数への置き換えを考えることはできません、と私はそれを理解したものから、それが重要なすべては、3つの結果の一つが独立してどのような彼らの、他のものよりも大きいことがあります値はそれは本当にあなたの意図ですか?

例:

For a cost [1,4,2], any of the following signals are ok by your function: 

[10,9,3] 
[1,0,0] 
[10e+45,1,10e-12] 
etc.... 

as long as the first one is greater, your loss is the lowest. 
+0

おかげで、あなたは正しい、この機能の目的はそれだけで放出された特定の信号に関連したコストを気にということでした。私は、進化的な計算の考え方から、信号に関連するアクションの実際のコストをより正確に反映させるために、さまざまな信号を生成するコストを重視したいという問題からアプローチしていました。私はコストとシグナルの平均積の2番目の損失関数を作成しました。 'tf.reduce_sum(S/tf.reduce_sum(S、axis = 1、keep_dims = True))* costs)'これは働いていましたが、何もしませんでした。多分MLはこれのための間違ったツールですか? –

+0

私はあなたの目標を理解しているかどうかわかりません... "どのアクションを取るべきか"(可能なアクションのサンプルの3つの要素のそれぞれ)を決定するモデルですか? –

+0

はい。このような問題をどのように構造化し、さまざまなアクションが必ずしも結果をもたらすわけではないということを考慮に入れるようにするための提案はありますか?それとも、直感的なやり方で問題を見ていますか? –

関連する問題