2

EDIT Mein Problem ist die Breite und Höhe meines Filter berechnet Spiel, falsch verstanden ich die API doc ... jetzt auf Korrektur arbeitenTensorflow conv2d_transpose (deconv) Anzahl der Reihen von out_backprop nicht

SOLUTION Folgen Entfaltungs von here Schlitten 53


ich habe ein ähnliches Problem wie here aber es ist ein wenig funkier.

Mein Fehler ist Conv2DBackpropInput: Number of rows of out_backprop doesn't match computed: actual = 25, computed = 26 zum Zeitpunkt der Initialisierung des Optimierers.

... also ist es um 1?

Einige Hintergrundinformationen ...

Ich habe eine konv Schicht mit den Abmessungen <tf.Tensor 'MaxPool_2:0' shape=(?, 25, 25, 128) dtype=float32>

Das Eingangsbild ist 200x200, und ich habe 3 maxpool Schichten - also die h = w = 25. Ich möchte füge 3 Dekonvierungslayer hinzu, so dass ich die ursprüngliche Auflösung zurückgebe (ich mache eine Bildsegmentierung).

Der deconv Code wie folgt aussieht:

temp_batch_size = tf.shape(x)[0] 
# output_shape = tf.pack([temp_batch_size, 50, 50, 64]) 
output_shape = [temp_batch_size, 50, 50, 64] 
conv4 = tf.nn.conv2d_transpose(conv3, weights['wdc1'], output_shape=output_shape, strides=[1,1,1,1], padding="VALID") 
# conv4 = tf.nn.local_response_normalization(conv4) 

# output_shape = tf.pack([temp_batch_size, 100, 100, 32]) 
output_shape = [temp_batch_size, 100, 100, 32] 
conv5 = tf.nn.conv2d_transpose(conv4, weights['wdc2'], output_shape=output_shape, strides=[1,1,1,1], padding="VALID") 
# conv5 = tf.nn.local_response_normalization(conv5) 

# output_shape = tf.pack([temp_batch_size, 200, 200, 1]) 
output_shape = [temp_batch_size, 200, 200, 1] 
conv6 = tf.nn.conv2d_transpose(conv5, weights['wdc3'], output_shape=output_shape, strides=[1,1,1,1], padding="VALID") 
# conv6 = tf.nn.local_response_normalization(conv6) 

(Sie können sehen, ich versuchte zu tf.pack() zu keinem Erfolg - wie here empfohlen) Wo die Gewichte:

'wdc1' : tf.Variable(tf.random_normal([25, 25, 64,128])), 

'wdc2' : tf.Variable(tf.random_normal([50, 50, 32,64])), 

'wdc3' : tf.Variable(tf.random_normal([100, 100, 1,32])), 

Einige Debugging sieht aus wie dies:

(Pdb) conv3 
<tf.Tensor 'MaxPool_2:0' shape=(?, 25, 25, 128) dtype=float32> 
(Pdb) conv4 
<tf.Tensor 'conv2d_transpose:0' shape=(?, ?, ?, ?) dtype=float32> 
(Pdb) conv5 
<tf.Tensor 'conv2d_transpose_1:0' shape=(?, ?, ?, ?) dtype=float32> 
(Pdb) conv6 
<tf.Tensor 'conv2d_transpose_2:0' shape=(?, ?, ?, ?) dtype=float32> 

Ich finde es seltsam, dass, weil ich t Er Linie temp_batch_size = tf.shape(x)[0] (wie empfohlen here), sind die letzten 3 Dimensionen auch Fragezeichen? Wenn ich die erste Dimension in eine Konstante (wie 10) ändere, bekomme ich <tf.Tensor 'conv2d_transpose:0' shape=(10, 50, 50, 64) dtype=float32>

Also ist das vielleicht Teil meines Problems? Wenn ich es wieder auf eine Konstante batch_size ändere, bekomme ich den Fehler ValueError: Shapes (10, 101, 101, 32) and (10, 100, 100, 32) are not compatible zum Zeitpunkt der Initialisierung des Optimierers. Wieder einmal um eins.

Debuggen mit dieser Konfiguration ...

(Pdb) conv4 
<tf.Tensor 'conv2d_transpose:0' shape=(10, 50, 50, 64) dtype=float32> 
(Pdb) conv5 
<tf.Tensor 'conv2d_transpose_1:0' shape=(10, 100, 100, 32) dtype=float32> 
(Pdb) conv6 
<tf.Tensor 'conv2d_transpose_2:0' shape=(10, 200, 200, 1) dtype=float32> 

Ist die Frage der Fortschritte meine Nummer? Was sie sein sollten (ich verschiedene Variationen ohne Erfolg versucht haben)

Antwort

5

Wenn transponiert Faltungen verwenden, können Sie rückwärts denken müssen: wie Sie Ihre Eingabe (conv3 der Form [batch_size, 25, 25, 128]) die Ausgabe gegeben ([batch_size, 200, 200, 1] der Form) erhalten würde ?

Sie würden eine Folge von 3x3 Windungen und max Pooling machen. Unglücklicherweise ist das Entladen in TensorFlow noch nicht verfügbar, Sie werden also nur Faltungen umgesetzt haben.

Die Filter sollten normale CNN Formen haben: wie 3x3 Windungen oder 5x5. Wenn Sie die Ausgabegröße erhöhen möchten, müssen Sie schrittweise Transponierungen verwenden.

weights = { 
    'wdc1' : tf.Variable(tf.random_normal([3, 3, 64, 128])), 
    'wdc2' : tf.Variable(tf.random_normal([3, 3, 32, 64])), 
    'wdc3' : tf.Variable(tf.random_normal([3, 3, 1, 32])) 
} 

Und der Code (vergessen Sie nicht den Schritt = 2):

temp_batch_size = 10 

conv3 = tf.zeros([temp_batch_size, 25, 25, 128]) 
output_shape = [temp_batch_size, 50, 50, 64] 
conv4 = tf.nn.conv2d_transpose(conv3, weights['wdc1'], output_shape=output_shape, strides=[1,2,2,1], padding="SAME") 

output_shape = [temp_batch_size, 100, 100, 32] 
conv5 = tf.nn.conv2d_transpose(conv4, weights['wdc2'], output_shape=output_shape, strides=[1,2,2,1], padding="SAME") 

output_shape = [temp_batch_size, 200, 200, 1] 
conv6 = tf.nn.conv2d_transpose(conv5, weights['wdc3'], output_shape=output_shape, strides=[1,2,2,1], padding="SAME") 

EDIT:

sah einfach Ihre bearbeiten. Die slides von CS231n sind eine sehr gute Illustration, wie man transponierte Windungen benutzt, es ist sogar noch besser mit der video!

+0

Danke Olivier! Genau das habe ich getan! –

+0

BTW, vergessen Sie nicht die ReLUs –

+0

ah guten Fang! Vielen Dank! –

Verwandte Themen