我使用TensorFlow实现了具有一个隐藏层的多层感知器(MLP),并在调用该函数时出现以下错误。任何帮助将不胜感激。
def MLP(x, option, dropout=1, prefix ='', num_outputs=1, reuse=None):
weights = tf.random_uniform_initializer(-0.001, 0.001)
biases = tf.constant_initializer(0.001, dtype=tf.float32)
fc1 = tf.contrib.layers.fully_connected(tf.nn.dropout(x, keep_prob=dropout),
num_outputs=option.num_outputs,
biases_initializer=biases,
weights_initializer = weights,
activation_fn=tf.nn.relu,
scope=prefix + 'fc',
reuse=reuse)
logits = tf.contrib.layers.linear(tf.nn.dropout(fc1, keep_prob=dropout),
num_outputs=num_outputs,
biases_initializer=biases,
weights_initializer = weights,
scope=prefix + 'l',
reuse=reuse)
return logits
logits = MLP(x, option, dropout=dp, prefix='mlp-', reuse=True)
ValueError:变量mlp-fc / weights不存在,或者未使用tf.get_variable()创建。你的意思是在VarScope中设置reuse = tf.AUTO_REUSE吗?
我尝试初始化权重并设置weights_initializer,但仍然遇到相同的错误。
答案 0 :(得分:2)
错误是因为您正在尝试重复名为'mlp-fc / weights'的权重,这些权重不存在。
同样的错误也可能适用于 tf.contrib.layers.linear 。
要重复使用,首先必须定义它们。
但是,如果您不想重复使用任何变量权重,只需从两种方法中删除 reuse = True , tf.contrib.layers .fully_connected 和 tf.contrib.layers.linear 。
修改强>
您可以使用类似于以下代码的内容。
with tf.variable_scope("mlp-fc"):
#add a new variable to the graph
var=tf.get_variable("weights",shape)
您可以按照本文的要求https://jasdeep06.github.io/posts/variable-sharing-in-tensorflow/了解有关重复使用的更多信息。
希望这有帮助。