2016-09-09 20 views
8

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:

Cost-Table

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

+2

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

+0

która linia jest błędem pochodzącym z – Julius

Odpowiedz

2

Dzięki programistom z grupy Lasagne naprawiłem to przez skonstruowanie własnej funkcji utraty.

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() 
0

Aby rozwiązać swój błąd składni:

Zmień

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

do

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

T.reshape oczekuje krotki osi, której nie dostarczyłeś, stąd błąd.

Przed penalizacją wyników fałszywie ujemnych (prognoza 0, prawda 1) upewnij się, że ten błąd przewidywania nie jest oparty na statystykach danych treningowych, ponieważ jest to @uyaseen suggested.

+0

Ale jak mogę karać bardziej pewne cele/prognozy? Jak na zdjęciu zamieszczonym na stole/obrazku? – KenobiShan

+0

Możesz używać ciężarów klas, aby zwiększyć utratę klasy, na której Ci zależy. Jest to najczęściej używane do równoważenia danych treningowych, ale jest to zwykle tylko sposób na zwiększenie liczby błędów z jednej konkretnej klasy. – nemo

+0

Tak, ale jak mogę wdrożyć na lasagne? – KenobiShan