Skip to main content
 首页 » 编程设计

python之无法在 TensorFlow 中共享/重命名变量

2024年08月16日33jyk

我正在尝试实现一个深度神经网络,我想在其中试验隐藏层的数量。为了避免容易出错的代码重复,我将层的创建放在一个 for 循环中,如下所示:

def neural_network_model(data, layer_sizes): 
    num_layers = len(layer_sizes) - 1 # hidden and output layers 
    layers = [] # hidden and output layers 
 
    # initialise the weights 
    for i in range(num_layers): 
        layers.append({ 
            'weights': tf.get_variable("W" + str(i+1), 
                       [layer_sizes[i], layer_sizes[i+1]],  
                       initializer = tf.contrib.layers.xavier_initializer()), 
             'biases': tf.get_variable("b" + str(i+1), [layer_sizes[i+1]],  
                       initializer = tf.zeros_initializer()) 
        }) 
        ... 

作为输入给出的列表 layer_sizes 看起来像这样:

layer_sizes = [num_inputs, num_hl_1, num_hl_2, ..., num_hl_n, num_outputs] 

当我第一次运行这段代码时,我没有遇到任何问题。但是,当我将 layer_sizes 更改为具有不同的层数时,出现错误:

ValueError: Variable W1 already exists, disallowed. Did you mean to set reuse=True or reuse=tf.AUTO_REUSE in VarScope 

我知道这是因为层的命名(我什至不关心)。我该如何解决这个问题并在重新运行时允许重命名?我进行了一些谷歌搜索,解决方案似乎在于使用 with tf.variable_scope(),但我无法弄清楚具体方法。

编辑 - 明确一点:我不想重复使用任何名称或变量。我只想在每次调用 neural_network_model 时(重新)初始化权重和偏差。

请您参考如下方法:

当创建多个不同的模型时,您需要确保它们都接收到唯一的变量名称。我在这里看到的最直接的方法是这样的:

def neural_network_model(data, layer_sizes, name): 
    num_layers = len(layer_sizes) - 1 # hidden and output layers 
    layers = [] # hidden and output layers 
 
    # initialise the weights 
    for i in range(num_layers): 
        with tf.variable_scope(name): 
            layers.append({ 
                'weights': tf.get_variable("W" + str(i+1), 
                           [layer_sizes[i], layer_sizes[i+1]],  
                           initializer = tf.contrib.layers.xavier_initializer()), 
                'biases': tf.get_variable("b" + str(i+1), [layer_sizes[i+1]],  
                      initializer = tf.zeros_initializer()) 
            }) 
    ... 

请注意如何使用额外的 name 参数来命名您的模型。然后你可以创建多个像

model1 = neural_network_model(data, some_layers, "model1") 
model2 = neural_network_model(data, other_layers, "model2") 

等这些模型将具有变量名称,例如“model1/W0”。请注意,您还可以使用 variable_scope 为不同层命名参数。 IE。您可以将 tf.variable_scope("layer"+ str(i)) 包裹在 get_variable 周围,而不是使用诸如 "W"+ str(i) 这样的名称。这将为您提供诸如“model1/layer0/W”之类的名称。作用域可以任意嵌套。

您可能想阅读 the TF Programmer's Guide on variables .