Jak zaimplementować ważoną binarną CrossEntropy na theano?Jak zaimplementować Weighted Binary CrossEntropy na theano?
Moja splotowa sieć neuronowa przewiduje tylko 0 ~~ 1 (sigmoid).
chcę karać moich przewidywań w ten sposób:
Zasadniczo, chcę karać WIĘCEJ kiedy model prognozuje 0, ale prawda była 1.
Pytanie: Jak utworzyć tę funkcję ważoną binarną CrossEntropy przy użyciu theano i lasagne?
Próbowałem to poniżej
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)
Ale ten błąd poniżej:
TypeError: Nowy kształt przekształcenia musi być wektorem lub lista/krotki skalarnych. Otrzymałem Subtensor {int64} .0 po konwersji do wektora.
referencyjny: https://github.com/fchollet/keras/issues/2115
referencyjny: https://groups.google.com/forum/#!topic/theano-users/R_Q4uG9BXp8
Ponieważ używasz 'binary_crossentropy (..)', będzie kara za każdą błędną prognozę. To, czego naprawdę potrzebujesz, to spojrzenie na sposób radzenia sobie z niezrównoważonymi zestawami danych, ten link [http://www.svds.com/learning-imbalanced-classes/] może być pomocny. – uyaseen
która linia jest błędem pochodzącym z – Julius