我只是通过该代码保存了一个模型:
def train():
with tf.Session() as sess:
saver = tf.train.Saver(max_to_keep = 2)
Loss = myYoloLoss([Scale1,Scale2,Scale3],[Y1, Y2 ,Y3])
opt = tf.train.AdamOptimizer(2e-4).minimize(Loss)
init = tf.global_variables_initializer()
sess.run(init)
imageNum = 0
Num = 0
while(1):
#get batchInput
batchImg,batchScale1,batchScale2,batchScale3 = getBatchImage(batchSize = BATCHSIZE)
for epoch in range(75):
_ , epochloss = sess.run([opt,Loss],feed_dict={X:batchImg,Y1:batchScale1,Y2:batchScale2,Y3:batchScale3})
if(epoch%15 == 0):
print(epochloss)
imageNum = imageNum + BATCHSIZE
Num = Num + 1
if(Num%4 == 0):
saver.save(sess,MODELPATH + 'MyModle__' + str(imageNum))
if(os.path.exists(STOPFLAGPATH)):
saver.save(sess,MODELPATH + 'MyModle__Stop_' + str(imageNum))
print('checked stopfile,stop')
break
return 0
然后我得到一些文件:
MyModle__Stop_288.index
MyModle__Stop_288.meta
MyModle__Stop_288.data-00000-of-00001
检查点
然后我想继续训练这个模型。
def reTrain():
with tf.Session() as sess:
loder = tf.train.import_meta_graph('E:/MyYoloModel/MyModle__Stop_288.meta')
loder.restore(sess, tf.train.latest_checkpoint('E:/MyYoloModel/'))
graph = tf.get_default_graph()
X = graph.get_tensor_by_name("X:0")
Y1 = graph.get_tensor_by_name("Y1:0")
Y2 = graph.get_tensor_by_name("Y2:0")
Y3 = graph.get_tensor_by_name("Y3:0")
Scale1 = graph.get_tensor_by_name("Scale1:0")
Scale2 = graph.get_tensor_by_name("Scale2:0")
Scale3 = graph.get_tensor_by_name("Scale3:0")
Loss = myYoloLoss([Scale1,Scale2,Scale3],[Y1, Y2 ,Y3])
#error code
opt = tf.train.AdamOptimizer(2e-4).minimize(Loss)
init = tf.global_variables_initializer()
sess.run(init)
batchImg,batchScale1,batchScale2,batchScale3 = getBatchImage(batchSize = BATCHSIZE)
for epoch in range(10):
_ ,epochloss = sess.run([opt,Loss],feed_dict={X:batchImg,Y1:batchScale1,Y2:batchScale2,Y3:batchScale3})
print(epochloss)
将发生此错误:
ValueError:图形中的节点名称重复:'conv2d_0 / kernel / Adam'
如何解决?
答案 0 :(得分:2)
我有一个类似的错误:
ValueError: Duplicate node name in graph: 'packed/0'
我认为此错误是由于Tensorfow版本与您所使用的代码不同而引起的。 在导入软件包时尝试降级tf版本:
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
这个琐碎的解决方案能够消除问题
答案 1 :(得分:0)
原因是AdamOptimizer在图形中创建了其他变量和操作。在存储模型时,将在还原模型时将这些操作存储并随图形一起加载。 如果您运行
tf.Graph.get_operations(graph)
您可以看到模型附带的操作列表。您将看到具有 / Adam或train / Adam 初始化的操作。当您尝试查找调整或重用模型时,新的AdamOptimizer会尝试再次创建这些操作,因此会引发“重复节点名称”错误。 解决此问题的一种方法是为新的AdampOptimzer命名。
opt = tf.train.AdamOptimizer(2e-4m name ='MyNewAdam')。minimize(Loss)
但是,我们还没有完成。 当您想重新使用权重时,无法初始化变量。但是,如果在运行训练时遇到未初始化参数的错误,这是由于新的AdamOptimizer变量尚未初始化而引起的。要解决这个问题,您需要通过以下方式初始化这些新变量:
uninitialized_vars = []
for var in tf.all_variables():
try:
sess.run(var)
except tf.errors.FailedPreconditionError:
uninitialized_vars.append(var)
tf.initialize_variables(uninitialized_vars)
注意:未使用的节点将不会执行,因此不会影响训练时间。
答案 2 :(得分:0)
我也遇到了这个问题,我通过在虚拟环境中更改一些代码来解决了这个问题: venv \ Lib \ site-packages \ tensorflow_core \ python \ framework \ ops.py 那里有一个叫做“ unique_name”的方法。这种方法在建立名称时有时会出错。特别是在使用其name_stack时。为了解决这个问题,我更改了方法并添加了一个小的splitAndSet方法来解决该问题:
{{1}}