2016-07-23 12 views
5

Tak, pracuję na budynku w pełni splotowego sieci (FCN), w oparciu off Marvin Teichmann's tensorflow-fcnsemantyczny segmentacja z tensorflow - ValueError w funkcji straty (rzadki-Softmax)

moich danych obrazu wejściowego, po raz bycie jest obrazem RGB o wymiarach 750x750x3. Po uruchomieniu sieci używam logi o kształcie [batch_size, 750,750,2] do obliczenia straty.

Jest to klasyfikacja binarna - Mam 2 klas tutaj, [0, 1], w moich etykiet (kształtu [batch_sizex750x750] A ci iść do funkcji strat, poniżej:

def loss(logits, labels, num_classes): 
with tf.name_scope('loss mine'): 
    logits = tf.to_float(tf.reshape(logits, [-1, num_classes])) 

    #CHANGE labels type to int, for sparse_softmax... 
    labels = tf.to_int64(tf.reshape(labels, [-1])) 

    print ('shape of logits: %s' % str(logits.get_shape())) 
    print ('shape of labels: %s' % str(labels.get_shape())) 

    cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits, labels, name='Cross_Entropy') 
    tf.add_to_collection('losses', cross_entropy) 

    loss = tf.add_n(tf.get_collection('losses'), name='total_loss') 
return loss 

Są. Kształty dla logits i etykiet po przekształcaniu:

shape of logits: (562500, 2) 
shape of labels: (562500,) 

i tu, to rzuca mi ValueError stwierdzając:

Shapes() and (562500,) are not compatible 

Pełny opis śledzenia poniżej:

File "train.py", line 89, in <module> 
loss_train = loss.loss(logits, data.train.labels, 2) 
File "/tensorflow-fcn/loss.py", line 86, in loss 
loss = tf.add_n(tf.get_collection('losses'), name='total_loss') 
File "/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/gen_math_ops.py", line 88, in add_n 
result = _op_def_lib.apply_op("AddN", inputs=inputs, name=name) 
File "/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/op_def_library.py", line 704, in apply_op 
op_def=op_def) 
File "/tensorflow/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 2262, in create_op 
set_shapes_for_outputs(ret) 
File "/tensorflow/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 1702, in  set_shapes_for_outputs 
shapes = shape_func(op) 
File "/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/math_ops.py", line 1557, in _AddNShape 
merged_shape = merged_shape.merge_with(input_.get_shape()) 
File "/tensorflow/lib/python2.7/site-packages/tensorflow/python/framework/tensor_shape.py", line 570, in merge_with 
(self, other)) 
ValueError: Shapes() and (562500,) are not compatible 

Sugestie? Czy moja implementacja tf.add_to_collection('losses', cross_entropy) jest nieprawidłowa?

UPDATE:

próbowałem uruchomić to bez sumowania całej pikseli (tak myślę), powracając cross_entropy w powyższym kodzie bezpośrednio, ponieważ straty.

Wygląda na to, że zadziałało. (To teraz rzuca ValueError z funkcji optymalizatora szkolenia, stwierdzając:. No gradients provided for any variable Zakładając ten ma więcej wspólnego z moim inicjalizacji wagi i uregulowania niż cokolwiek innego

UPDATE 2:.

powyższym (dotyczącą ValueError należytej w przypadku braku gradientów), jak wspomniano wcześniej: here, ten komunikat jest zwykle napotkany, gdy nie ma ścieżki między dowolnymi zdefiniowanymi obiektami tf.Variable i tensorem strat, który jest minimalizowany.

Początkowy problem z użytkowaniem z tf.add_n kontynuuje, zakładam to ma związek z mechaniką działania kolekcji wykresów w TensorFlow. Po zainicjalizowaniu moich zmiennych błąd brzmi teraz:

Shapes() and (?,) are not compatible 
+0

Witam, Murushiv, czy mogłabyś się bardziej podzielić, jak definiujesz logi kształtu [batch_size, 750,750,2]? – user288609

+0

@ user288609 logits (nie wiem tutaj mojej terminologii) o rozmiarze wsadu, o którym wspomniałeś, wydobywam z modelu (metoda kompilacji). Coś konkretnego, co chcesz wiedzieć? – mshiv

Odpowiedz

3

Zamykanie. Okazało się, że kod w funkcji straty brakowało średniej sumy. Dla każdego, kto mierzy się z tym problemem, zmodyfikuj funkcję utraty, jak poniżej, i powinna działać poprawnie.

cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits, labels, name='Cross_Entropy') 
    cross_entropy_mean = tf.reduce_mean(cross_entropy, name='xentropy_mean') 
    tf.add_to_collection('losses', cross_entropy_mean) 

    loss = tf.add_n(tf.get_collection('losses'), name='total_loss') 
return loss 
+1

Możesz zaakceptować własną odpowiedź –

+0

@OlivierMoindrot zrobi, gdy będę mógł. – mshiv

+0

Podczas implementacji funkcji utraty wynikiem jest nan. Jaki jest tego powód? Dzięki – Lei

Powiązane problemy