2017-04-13 3 views
5

Ich habe ein Netzwerk in Tensorflow, und ich möchte eine Funktion definieren, die ihre Eingabe über eine tf.layers.dense Ebene (offensichtlich, die gleiche) gibt. Ich sehe das Argument reuse, aber um es richtig verwenden zu können, scheint es, dass ich eine globale Variable behalten muss, nur um mich zu erinnern, ob meine Funktion bereits aufgerufen wurde. Gibt es einen saubereren Weg?Wie kann ich eine Dense-Ebene wiederverwenden?

Antwort

4

Soweit ich weiß, gibt es keinen saubereren Weg. Das Beste, was wir tun können, ist tf.layers.dense in unsere Abstraktion wickeln und es als Objekt verwenden, variable scope ‚s Backbone versteckt:

def my_dense(*args, **kwargs): 
    scope = tf.variable_scope(None, default_name='dense').__enter__() 
    def f(input): 
    r = tf.layers.dense(input, *args, name=scope, **kwargs) 
    scope.reuse_variables() 
    return r 
    return f 

a = [[1,2,3], [4,5,6]] 
a = tf.constant(a, dtype=tf.float32) 
layer = my_dense(3) 
a = layer(a) 
a = layer(a) 

print(*[[int(a) for a in v.get_shape()] for v in tf.trainable_variables()]) 
# Prints: "[3, 3] [3]" (one pair of (weights and biases)) 
+1

Wow, das ist sauber. Viel sauberer als das Durcheinander, bei dem ich gelandet bin! – Akiiino

+1

Sie sollten einen Namen an "my_dense" übergeben, damit dieser Trick für verschiedene Ebenen verwendet werden kann. – Sorin

4

Sie können die Schicht gegen eine Konstante der richtigen Größe konstruieren und das Ergebnis ignorieren.

Auf diese Weise wird die Variable deklariert, aber die Operation sollte aus dem Graphen herausgeschnitten werden.

Zum Beispiel

tf.layers.dense(tf.zeros(1, 128), 3, name='my_layer') 

... later 
hidden = tf.layers.dense(input, 3, name='my_layer', reuse=True) 
0

Ich finde tf.layers.Dense sauberer als die oben genannten Antworten. Alles, was Sie brauchen, ist ein Denses Objekt, das Sie vorher definiert haben. Dann können Sie es beliebig oft wiederverwenden.

import tensorflow as tf 

# Define Dense object which is reusable 
my_dense = tf.layers.Dense(3, name="optional_name") 

# Define some inputs 
x1 = tf.constant([[1,2,3], [4,5,6]], dtype=tf.float32) 
x2 = tf.constant([[4,5,6], [7,8,9]], dtype=tf.float32) 

# Use the Dense layer 
y1 = my_dense(x1) 
y2 = my_dense(x2) 

with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    y1 = sess.run(y1) 
    y2 = sess.run(y2) 
    print(y1) 
    print(y2) 

Tatsächlich tf.layers.dense Funktion konstruiert intern ein dichtes Objekt und geben Sie Ihre Eingabe in das Objekt. Weitere Informationen finden Sie unter code.

Verwandte Themen