我目前在恢复这个模型以进行预测时遇到了麻烦。
代码如下:
def neural_network(data): with tf.name_scope("network"): layer1 = tf.layers.dense(data, 1000, activation=tf.nn.relu, name="hidden_layer1") layer2 = tf.layers.dense(layer1, 1000, activation=tf.nn.relu, name="hidden_layer2") output = tf.layers.dense(layer2, 2, name="output_layer") return outputdef evaluate(): with tf.name_scope("loss"): global x xentropy = tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=neural_network(x)) loss = tf.reduce_mean(xentropy, name="loss") with tf.name_scope("train"): optimizer = tf.train.AdamOptimizer() training_op = optimizer.minimize(loss) with tf.name_scope("exec"): with tf.Session() as sess: for i in range(1, 10): sess.run(tf.global_variables_initializer()) sess.run(training_op, feed_dict={x: np.array(train_data).reshape([-1, 1]), y: label}) print "Training " + str(i) saver = tf.train.Saver() saver.save(sess, "saved_models/testing") print "Model Saved."def predict(): with tf.name_scope("predict"): output = neural_network(x) output = tf.nn.softmax(output) with tf.Session() as sess: saver = tf.train.import_meta_graph("saved_models/testing.meta") # saver = tf.train.Saver() saver.restore(sess, "saved_models/testing") print sess.run(output, feed_dict={x: np.array([12003]).reshape([-1, 1])})
我尝试使用 tf.train.Saver()
来恢复模型,但也得到了同样的错误。
错误信息是 ValueError: Variable hidden_layer1/kernel already exists, disallowed. Did you mean to set reuse=True in VarScope? Originally defined at:
我尝试为 tf.layers.dense()
设置 reuse=True
,但结果导致我无法训练图(给出了与上述相同的 ValueError,但要求设置 reuse=None
)。
我猜测这可能与图仍然存在于会话中有关,所以当我尝试恢复它时,它检测到了重复的图。然而,我认为这不应该发生,因为会话已经关闭了。
完整代码链接:gistlink
回答:
我认为你是在同一个图中加载变量。尝试创建一个新的图并加载它。你可以尝试这样做:
loaded_graph = tf.Graph()with tf.Session(graph=loaded_graph) as sess: # 加载带有训练状态的图