2016-05-06 4 views
2

Ich versuche, FCN auf Tensorflow reimplementieren. Ich habe die Dekonvolutionsebene als solche implementiert.Fully Convolution Net (FCN) auf Tensorflow

up8_filter = tf.Variable(tf.truncated_normal([64, 64, 21, 21])) 
prob_32 = tf.nn.conv2d_transpose(score, up8_filter, output_shape = [batch_size, 224, 224, 21], strides = [1, 32, 32, 1]) 
tf.histogram_summary('fc8_filter', up8_filter) 

Ausbildung sieht mit dem Verlustwert Abwurf gut, bis es Nan werden. Ich habe Tensorboard überprüft und es deutet darauf hin, dass up8_filter auseinander zu gehen scheint.

Gibt es einen Weg, um den Gewichtswert in Tensorflow regularisieren?
Ich habe folgende Methoden versucht

  1. Lower Lernrate
  2. Null-Mittelwert Bild

Ich habe Implementierung nicht Pad Bild 100 Pixel per FCN seit Tensorflow conv2d es nicht unterstützt. Ich konvertierte VGG Gewicht unter Verwendung caffe-tensorflow, es gibt nicht viel, das ich tun kann, um seine Netzstruktur zu ändern.

Es tut mir leid für die verwirrende Frage, es gibt so viele Dinge falsch zu machen und ich bin mir nicht sicher, wo ich anfangen soll.

Snippet für den Verlustwert.

Schritt 1: Verlust = 732171599872,00
Schritt 10: Verlust = 391914520576,00
Schritt 20: Verlust = 32141299712,00
Schritt 30: Verlust = 1255705344,00

[Update]:

Verlustfunktion loss32

loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(
            tf.reshape(prob_32, [batch_size*224*224, 21]), 
            tf.reshape(lbl_ph, [-1]))) 

[Update2]

Ich folgte Vorschlag von Ziky90 und es hat funktioniert. Das Training konvergierte nun und der Deconv-Filter scheint zu divergieren. Ich werde über die Genauigkeit berichten.

+0

niedrigere Lernrate mehr? –

+0

Was ist Ihre Verlustfunktion? – mrphoenix13

+0

Ich spiele gerade mit FCNs und versuche, sie im Tensorflow arbeiten zu lassen. Wenn ich das mit der Referenz-Caffe-Implementierung vergleiche, dann sehe ich, dass Sie die Gewichte nicht durch bilineare Interpolation in der 'deconvolution' /' tf.nn.conv2d_transpose'-Ebene, sondern durch tf.truncated_normal initialisieren. BTW. Ich lösen verwandte Sachen bei: http://StackOverflow.com/Questions/36746860/Fcn-in-Tensorflow-missing-Crop-Layer – ziky90

Antwort

2

Wenn ich das mit der Referenz caffe Implementierung vergleichen, dann sehe ich, dass Sie nicht Gewichte in der deconvolution/tf.nn.conv2d_transpose Schicht durch bilineare Interpolation werden initialisiert, sondern durch tf.truncated_normal.

Sie können in caffe Blick auf die Referenz-Implementierung haben here und einen Blick von here

4

Auch an meinem Tensorflow FCN implementation genannt wird. Training funktioniert, wenn dieses loss function in Kombination mit this Trainingsskript verwendet wird.

Hier sind einige Erkenntnisse, die ich bei der Implementierung von FCN gewonnen habe.

  1. Der Deconv-Filter muss bilinear initialisiert werden.
  2. tf.nn.sparse_softmax_cross_entropy_with_logits kann verwendet werden, aber es verursacht in einigen Fällen numerische Instabilitäten. Siehe auch diese Tensorflow issue. Ich beschloss daher, die Kreuzentropie mit Tensoroperationen zu implementieren.
  3. Wenn große Bilder verwendet werden (was zu großen softmax batches führt), ist eine Reduzierung der Trainingsrate sinnvoll. Adam Optimizer in Kombination mit einer Lernrate von 1e-6 scheint nützlich zu sein.
+0

Hallo MarvMind, für Ihre FCN-Implementierung haben Sie auch Testcode wie test_fcn16_vgg.py bereitgestellt. Überschneidet sich das mit dem in der Tensorvision enthaltenen Auswerteskript? Können Sie den Arbeitsablauf der Verwendung von Tensorvison kombiniert mit FCN-Implementierung ausarbeiten? – user288609