2017-05-22 59 views
1

Sharing Variable教程中,它說明如何使用函數get_variable()重用先前創建的變量。瞭解Tensorflow中的_linear函數

with tf.variable_scope("foo"):  # Creation 
    v = tf.get_variable("v", [1]) 

with tf.variable_scope("foo", reuse=True): # Re-using 
    v1 = tf.get_variable("v", [1]) 

_linear()功能的here實施,get_variable()功能的使用方法如下。

with vs.variable_scope(scope) as outer_scope: 
    weights = vs.get_variable(
     _WEIGHTS_VARIABLE_NAME, [total_arg_size, output_size], 
     dtype=dtype, 
     initializer=kernel_initializer) 

據我所知_linear()功能是用來做操作args * W + bias。這裏權重(W)必須是可重用的。
但他們在函數裏面使用_linear()函數,我認爲每次都會創建一個新變量。但是W必須可以重用於神經網絡。

我在尋求理解這裏發生了什麼。

回答

0

他們使用下面的事實證明here

注意,再使用的標誌是繼承的:如果我們打開重用範圍,那麼它的所有子範圍變得重複使用爲好。

因此,如果您的作用域嵌入到相應地設置重用標誌的父作用域中,則您都已設置。例如:

import tensorflow as tf 

def get_v(): 
    with tf.variable_scope("foo"): 
     v = tf.get_variable("v", shape=(), initializer=tf.random_normal_initializer()) 
    return v 

with tf.variable_scope("bar"): 
    v = get_v() 
with tf.variable_scope("bar", reuse=True): 
    v1 = get_v() 

sess = tf.Session() 
sess.run(tf.global_variables_initializer()) 
sess.run(v) 
sess.run(v1) # returns the same value 

在本情況下,父保護範圍由tf.python.layers.Layer父類創建。