RuntimeError: cannot create link (name already exists)当使用Goo



我已经创建了一个模型测试管道,用于我的实习,并在Google Colab上运行。该管道允许对多组模型和参数进行背靠背测试。它将以用户定义的方式启动一个模型和一组参数,进行15个epoch的训练,每个epoch之后进行验证。它使用两个ModelCheckpoints将模型保存为h5文件,一个保存每个epoch,另一个保存最好的epoch,在一个已知的名称下在不同的文件夹中,以便以后可以轻松加载。

作为参考,测试的每个模型/参数集都使用唯一的测试者id和模型计数数来标识,每个模型都增加一个模型计数数。保存每个epoch的模型检查点也在末尾附加了epoch号。

在所有15个epoch之后,加载最佳模型并在我们的测试集上进行评估。然后启动下一个模型和参数集,并重复该过程,直到达到用户定义的停止点。

至少,它应该是这样工作的。

实际情况是,第一个要运行的模型按照计划运行。然后加载下一个模型,并为一个epoch进行训练和验证。但是,当需要为第一个epoch保存检查点时,会抛出以下内容:RuntimeError: Unable to create link (name already exists)

在此之后,我找到的唯一方法是而不是在第一个epoch结束时遇到的错误是重置Colab运行时。在错误再次发生之前我得到了一个额外的1模型。(注意:这不是我之前得到的相同的1模型,我调整了方法参数,从需要运行的下一个模型开始)

最后,为了明确这个错误的最常见原因,我试着运行model.summary()for i, w in enumerate(model.weights): print(i, w.name)。我没有重复的名字。

我不确定为什么这种行为会发生,我最好的猜测是它会落在Colab的缓存行为和ModelCheckpoint使用的任何方法来保存文件的组合下,导致它解释一个没有名称重叠的地方。

如果能提供进一步的见解,说明为什么会发生这种情况,以及如何解决,将不胜感激。

我最终解决了这个问题,但问题不是我所认为的那样。问题在于我使用一个类来包装我用于model.fit()model.predict()的参数。对于optimizer参数,我的默认值是Adam(learning_rate=0.0001)。由于参数是可变对象,因此每次运行都会重用它,从而导致错误。我将默认值更改为None,并将变量初始化为默认值,如果值为方法中的None,问题就消失了。

相关内容

  • 没有找到相关文章

最新更新