Tensorflow:导入的操作总是导致"None",尽管输入和内核有效



我想做以下事情:

  • a( 定义模型图
  • b( 启动模型并对其进行训练 有限的NUMBER_OF_PRE_ITERATIONS(比方说, NUMBER_OF_PRE_ITERATIONS=20(。保存模型。
  • c( 重复第 b( 点 NUMBER_OF_PRE_RUNS次(例如NUMBER_OF_PRE_RUNS=3(。每次,如果 "新"模型比"保存"模型"新"模型提供更好的结果 得救了。

作为 c( 的结果,我应该有一个模型(可能(在NUMBER_OF_PRE_RUNS模型中具有最佳初始值。

  • d( 导入"保存"(可能(最佳模型并继续训练。

问题:每次,导入模型的所有操作都会导致"无"值。 输入数字似乎有效,内核和偏差参数也是如此。那里没有"无"或任何其他可疑数字,只有浮动数字。那么,为什么每次操作的结果都是"无"呢?

这是(简化的(代码:

# imports
# declarations of variables etc.
tf.reset_default_graph()
with tf.variable_scope(name_or_scope='Model_', reuse=tf.AUTO_REUSE):
x = tf.placeholder(...)
y = tf.placeholder(...)
input_layer = tf.layers.dense(...)
inter_layer = tf.layers.dense(...)
output_layer = tf.layers.dense(...)
loss_funct = tf.reduce_mean(tf.abs(y - output_layer), name='loss_f')
optimit = tf.train.GradientDescentOptimizer(learning_rate=LEARNING_RATE, name='optimit')
train = optimit.minimize(loss=loss_funct, name='train')

saver = tf.train.Saver()
best_pre_result = 99999
for pre_run in range(NUMBER_OF_PRE_RUNS):
with tf.Session() as presess:
presess.run(tf.global_variables_initializer())
for pre_iteration in range(NUMBER_OF_PRE_ITERATIONS):
for batch in range(NUMBER_OF_BATCHES):
x_batch, y_batch = get_batches(...)
presess.run(train, feed_dict={x: x_batch, y: y_batch})
if pre_iteration % 10 == 0:
# Monitor performance here. Training seems to progress in valid way.
if pre_iteration == NUMBER_OF_PRE_ITERATIONS - 1:
pre_result = presess.run(loss_funct, feed_dict={x: all_features, y: all_targets})
if pre_result < best_pre_result:
best_pre_result = pre_result
model_path = saver.save(sess=presess, save_path=SAVE_MODEL_PATH)
# tried without the below line, but result was the same.
tf.reset_default_graph()
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())        
restorer = tf.train.import_meta_graph(SAVE_MODEL_PATH + ".meta")
restorer.restore(sess=sess, save_path=model_path)
x_ = tf.get_default_graph().get_tensor_by_name(name='Model_/x:0')
y_ = tf.get_default_graph().get_tensor_by_name(name='Model_/y:0')
compute_input_ = tf.get_default_graph().get_operation_by_name(name='Model_/input_layer/Tanh')
# otehr operations & tensors imported here for performance monitoring
loss_funct_ = tf.get_default_graph().get_operation_by_name(name='Model_/loss_f')
train_ = tf.get_default_graph().get_operation_by_name(name='Model_/train')
for iteration in range(...):
for batch in range(...):
x_batch, y_batch = get_batches(...)
sess.run(train_, feed_dict={x_: x_batch, y_: y_batch})
# Monitor performance here. All ops result in "None".

你从什么张量那里得到 None ?如果您从loss_funct获得 None ,这就是您使用 get_operation_by_name 进行loss_funct的原因。我们应该使用get_tensor_by_name来获取操作的结果。

在下面的代码中,最后一行显示"无"。

with tf.variable_scope("model"):
x = tf.get_variable(name="x", shape=[3], initializer=tf.initializers.random_normal())
y = tf.reduce_sum(x, name="y")
saver = tf.train.Saver()
save_path = "./saver"
pre_max = -10000
for i in range(3):
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
cur_y = sess.run(y)
print(cur_y)
if cur_y > pre_max:
pre_max = cur_y
model_path = saver.save(sess=sess, save_path=save_path)
print("max_y : ", pre_max)
tf.reset_default_graph()
with tf.Session() as sess:
restorerer = tf.train.import_meta_graph(save_path + ".meta")
restorerer.restore(sess, save_path)
y_tensor = tf.get_default_graph().get_tensor_by_name(name='model/y:0')
y_op = tf.get_default_graph().get_operation_by_name(name='model/y')
print(sess.run(y_tensor))
print(sess.run(y_op))

相关内容

最新更新