2017-03-17 19 views
5

Próbuję utworzyć dwie warstwy konwergencji o tych samych masach, ale wydaje się, że interfejs API nie działa.Zmienna ponownego użycia TensorFlow z 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) 

To wypisuje

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

Zmiana z tf.contrib.layers.conv2d do tf.layers.conv2d nie rozwiązuje problemu.

Ma ten sam problem z 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) 

daje

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

dla pierwszego przykładu, dlaczego ponowne użycie jest prawdziwe, nawet w pierwszym konweniu? – Steven

+0

@Steven Wypróbowałem wszystkie kombinacje, aby ponownie użyć = Prawda, ale żadna z nich nie była skuteczna. Czy możesz podać krótki przykład na to, jak sprawić, aby wagi mogły być udostępniane za pomocą tf.layers.conv2d? – Xingdong

+0

Zwykle robię to ręcznie, tj. Tworzę ciężary, a następnie przekazuję je. Wtedy mam zmienną wagową, którą mogę ponownie wykorzystać, po prostu używając tej samej zmiennej. Mogę pokazać przykład tego? – Steven

Odpowiedz

9

W kodzie napisałeś, zmienne daj się ponownie wykorzystane między dwiema warstwami splotu. Wypróbuj to:

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'] 

Zauważ, że utworzono tylko jeden ciężar i jeden tensor obciążenia. Mimo że dzielą one wagi, warstwy nie współdzielą rzeczywistych obliczeń. Stąd widać dwie różne nazwy operacji.

+2

Zauważ, że możesz ustawić 'reuse = tf.AUTO_REUSE', abyś nie musiał ustawiać go na' False'/'None' dla pierwszego połączenia, a' True' dla kolejnych. Dzięki temu nie potrzebujesz specjalnego przypadku do pierwszego połączenia. – Nathan