2016-04-30 8 views
2

Frage: Ich konvertiere das grundlegende MNIST-Beispiel von Tensorflow in eine vollständig konvolutionelle Implementierung. Jetzt dauern 100 Iterationen etwa 20 mal länger als zuvor. Was verursacht das?Warum braucht eine vollkonvertierte Schicht mehr Zeit als die FC-Schicht in TensorFlow?

Ich nehme das grundlegende MNIST Beispiel von der Tensorflow Website. Jetzt wandle ich die endgültige FC Schicht auf eine Faltungsschicht, inspiriert von this post by Yann LeCunn und this Quora post, oder allgemeiner, um den Artikel Fully Convolutional Networks for Semantic Segmentation

Also ich diesen Code Block

with tf.name_scope("Fully_Connected") as scope: 
    W_fc1 = weight_variable([7**2 * 64, 1024], 'Fully_Connected_layer_1') 
    b_fc1 = bias_variable([1024], 'bias_for_Fully_Connected_Layer_1') 
    h_pool2_flat = tf.reshape(h_pool2, [-1, 7**2*64]) 
    h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1) 

Zu diesem Codeblock

with tf.name_scope("FC_conv") as scope: 
    W_fcc1 = weight_variable([7,7,64,1024],'FC_conv_1') 
    b_fcc1 = bias_variable([1024],'bias_for_FC_conv_1') 
    h_fcc1 = tf.nn.relu(tf.nn.conv2d(h_pool2, W_fcc1, strides=[1, 1, 1, 1], padding='VALID')+b_fcc1) 
ändern

Nach dieser Änderung dauern 100 Iterationen 70 Sekunden im Gegensatz zu einigen Sekunden. Das bedeutet, dass die FC-Implementierung für 100 Iterationen ungefähr 5 Sekunden dauerte. Die vollständige Conv-Implementierung dauert ungefähr 70 Sekunden für 100 Iterationen.

Kann mir jemand einen Hinweis geben? Warum benötigt diese Faltungsimplementierung so viel Zeit?

Vielen Dank für Ihre Zeit und Antworten

Antwort

1

Normalerweise sind Faltungsschichten wesentlich effizienter als vollständig verbundene Schichten, aber das ist, weil sie einen Weg, um drastisch zu reduzieren die Anzahl der Parameter bieten, die optimiert werden müssen . In diesem Fall, wenn ich mich nicht irre, ist die Anzahl der Parameter gleich, da die Faltungs-Kernel auf das gesamte Ausmaß der Eingabe angewendet werden. In gewissem Sinne ist es der lokal verbundene Aspekt von Faltungsschichten, der Ihnen die reduzierte Rechenkomplexität abnimmt.

Der große Unterschied ist also, dass die Faltungsschicht jeden Wert mit einem 7x7 Kernel falten muss. Die gängige Meinung, die ich gehört habe, ist, dass es am besten ist, die Größe der Kerne auf 3 × 3 oder höchstens 5 × 5 zu halten, und dies ist zum Teil auf den Rechenaufwand des Faltungsprozesses mit größeren Kernen zurückzuführen.

Ich habe mich nicht persönlich mit der Verwendung von Faltungsnetzwerke beschäftigt, aber von dem, was ich sammeln kann, ist der Zweck, die Genauigkeit des Modells zu verbessern, nicht so sehr, um die Effizienz zu verbessern. Ich hoffe, das hilft.

Verwandte Themen