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
Witam, Murushiv, czy mogłabyś się bardziej podzielić, jak definiujesz logi kształtu [batch_size, 750,750,2]? – user288609
@ 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