2017-03-17 5 views
5

Ich versuche, 2 Conv Ebenen die gleichen Gewichte zu teilen, jedoch scheint es, dass die API nicht funktioniert.TensorFlow Wiederverwendungsvariable mit tf.layers.conv2d

import tensorflow as tf 

x = tf.random_normal(shape=[10, 32, 32, 3]) 

with tf.variable_scope('foo') as scope: 
    conv1 = tf.contrib.layers.conv2d(x, 3, [2, 2], padding='SAME', reuse=True, scope=scope) 
    print(conv1.name) 

    conv2 = tf.contrib.layers.conv2d(x, 3, [2, 2], padding='SAME', reuse=True, scope=scope) 
    print(conv2.name) 

Es die Blätter aus tf.contrib.layers.conv2d zu tf.layers.conv2d

foo/foo/Relu:0 
foo/foo_1/Relu:0 

Ändern out das Problem nicht lösen.

Es hat das gleiche Problem mit tf.layers.conv2d:

import tensorflow as tf 

x = tf.random_normal(shape=[10, 32, 32, 3]) 

conv1 = tf.layers.conv2d(x, 3, [2, 2], padding='SAME', reuse=None, name='conv') 
print(conv1.name) 
conv2 = tf.layers.conv2d(x, 3, [2, 2], padding='SAME', reuse=True, name='conv') 
print(conv2.name) 

gibt

conv/BiasAdd:0 
conv_2/BiasAdd:0 
+0

für das erste Beispiel, warum ist die Wiederverwendung auch bei der ersten Conv wahr? – Steven

+0

@Steven Ich habe alle Kombinationen versucht, um Wiederverwendung = True, aber keiner von ihnen, um wirksam zu sein. Könnten Sie uns helfen, ein kurzes Beispiel dafür zu geben, wie die Gewichte mithilfe von tf.layers.conv2d geteilt werden? – Xingdong

+0

Normalerweise mache ich es von Hand, d. H. Erzeuge die Gewichte und gebe sie dann weiter. Dann habe ich die Gewichtsvariable, die ich wiederverwenden kann, indem ich einfach die gleiche Variable verwende. Ich kann ein Beispiel dafür zeigen? – Steven

Antwort

9

Im Code, den Sie geschrieben haben Variablen zwischen den beiden Faltungs Schichten wiederverwendet erhalten. Versuchen Sie folgendes:

import tensorflow as tf 

x = tf.random_normal(shape=[10, 32, 32, 3]) 

conv1 = tf.layers.conv2d(x, 3, [2, 2], padding='SAME', reuse=None, name='conv') 

conv2 = tf.layers.conv2d(x, 3, [2, 2], padding='SAME', reuse=True, name='conv') 

print([x.name for x in tf.global_variables()]) 

# prints 
# [u'conv/kernel:0', u'conv/bias:0'] 

Beachten Sie, dass nur ein Gewicht und eine Bias-Tensor erstellt wurde. Obwohl sie sich die Gewichte teilen, teilen sich die Ebenen nicht die eigentliche Berechnung. Daher sehen Sie die zwei verschiedenen Namen für die Operationen.

+2

Beachten Sie, dass Sie 'reuse = tf.AUTO_REUSE' so einstellen können, dass Sie es beim ersten Aufruf nicht auf' False'/'None' setzen müssen und dann auf' True' für nachfolgende. Dies verhindert, dass Sie einen Sonderfall für den ersten Anruf benötigen. – Nathan