8

theano に加重バイナリ CrossEntropy を実装する方法は?

私の畳み込みニューラル ネットワークは 0 ~~ 1 (シグモイド) しか予測しません。

私はこのように私の予測にペナルティを課したい:

コストテーブル

基本的に、モデルが 0 を予測したが、真実が 1 だった場合、MORE にペナルティを課したいと考えています。

質問: theano と lasagne を使用して、この加重バイナリ CrossEntropy関数を作成するにはどうすればよいですか?

私はこれを以下で試しました

prediction = lasagne.layers.get_output(model)


import theano.tensor as T
def weighted_crossentropy(predictions, targets):

    # Copy the tensor
    tgt = targets.copy("tgt")

    # Make it a vector
    # tgt = tgt.flatten()
    # tgt = tgt.reshape(3000)
    # tgt = tgt.dimshuffle(1,0)

    newshape = (T.shape(tgt)[0])
    tgt = T.reshape(tgt, newshape)

   #Process it so [index] < 0.5 = 0 , and [index] >= 0.5 = 1


    # Make it an integer.
    tgt = T.cast(tgt, 'int32')


    weights_per_label = theano.shared(lasagne.utils.floatX([0.2, 0.4]))

    weights = weights_per_label[tgt]  # returns a targets-shaped weight matrix
    loss = lasagne.objectives.aggregate(T.nnet.binary_crossentropy(predictions, tgt), weights=weights)

    return loss

loss_or_grads = weighted_crossentropy(prediction, self.target_var)

しかし、私は以下のエラーを受け取ります:

TypeError: reshape の新しい形状は、ベクトルまたはスカラーのリスト/タプルでなければなりません。ベクトルへの変換後に Subtensor{int64}.0 を取得しました。


参考:https ://github.com/fchollet/keras/issues/2115

参考:https ://groups.google.com/forum/#!topic/theano-users/R_Q4uG9BXp8

4

2 に答える 2

2

ラザニア グループの開発者のおかげで、独自の損失関数を構築することでこれを修正しました。

loss_or_grads = -(customized_rate * target_var * tensor.log(prediction) + (1.0 - target_var) * tensor.log(1.0 - prediction))

loss_or_grads = loss_or_grads.mean()
于 2016-12-20T19:33:19.067 に答える
0

構文エラーに対処するには:

変化する

newshape = (T.shape(tgt)[0])
tgt = T.reshape(tgt, newshape)

newshape = (T.shape(tgt)[0],)
tgt = T.reshape(tgt, newshape)

T.reshape軸のタプルが必要ですが、これを提供しなかったため、エラーが発生しました。

偽陰性 (予測 0、真実 1) にペナルティを課す前に、 @uyaseen が提案したように、この予測エラーがトレーニング データの統計に基づいていないことを確認してください。

于 2016-09-16T17:00:15.123 に答える