我正在尝试实现一个深度神经网络,我想在那里试验隐藏层的数量。为了避免容易出错的代码重复,我将层的创建放在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
时(重新)初始化权重和偏差。
答案 0 :(得分:1)
创建多个不同的模型时,需要确保它们都接收唯一的变量名称。我在这里看到的最直接的方式是这样的:
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
命名不同图层的参数。即而不是使用诸如"W" + str(i)
之类的名称,您可以在tf.variable_scope("layer" + str(i))
周围包裹get_variable
。这将为您提供诸如" model1 / layer0 / W"之类的名称。范围可以任意嵌套。
答案 1 :(得分:1)
如果您不希望重复使用变量,那么您不应该使用tf.get_variable
。一个简单的tf.Variable
应该可以工作,而不会遇到你所看到的冲突。
您可以在tensorflow文档中看到this page以获取更多信息:他们的第一个示例解释了在再次调用示例函数时将创建一组全新的变量。然后他们解释如何避免这种情况,但似乎在这种情况下,这正是你想要的。
答案 2 :(得分:1)
我认为找到了最简单的解决方案。事实证明我遇到了这个问题,因为我使用了一个Jupyter笔记本,只要我不重新启动内核,所有变量都会保持活跃状态。
我的解决方案是在调用任何内容之前简单地重新初始化所有变量:
tf.reset_default_graph()