Python 获取运行时错误:无法使用多输入Keras模型创建链接(名称已存在)

Python 获取运行时错误:无法使用多输入Keras模型创建链接(名称已存在),python,tensorflow,image-processing,keras,Python,Tensorflow,Image Processing,Keras,我无法保存Keras模型,因为我遇到了标题中提到的错误。我一直在使用tensorflow gpu。我的模型由4个输入组成,每个输入是一个ResNet50。当我只使用一个输入时,下面的回调工作得很好,但是使用多个输入时,我得到了以下错误: 运行时错误:无法创建链接名称已存在 现在,如果没有回调,我无法在培训结束时保存模型,因为我遇到了相同的错误,但我能够使用以下代码修复该错误: 此代码仅适用于单输入模型,并放在训练函数model.fit之后 对于回调,即使上面的代码也不起作用。这篇文章不知怎么地与

我无法保存Keras模型,因为我遇到了标题中提到的错误。我一直在使用tensorflow gpu。我的模型由4个输入组成,每个输入是一个ResNet50。当我只使用一个输入时,下面的回调工作得很好,但是使用多个输入时,我得到了以下错误:

运行时错误:无法创建链接名称已存在

现在,如果没有回调,我无法在培训结束时保存模型,因为我遇到了相同的错误,但我能够使用以下代码修复该错误:

此代码仅适用于单输入模型,并放在训练函数model.fit之后

对于回调,即使上面的代码也不起作用。这篇文章不知怎么地与我的工作有关

我已经读到这个问题可以通过tf每晚解决,所以我尝试了,但没有成功

我已经用一种新的方法进行了测试。所以我检查了tf版本,它和我的2.3.0版本一样。至于cuda,colab和我的机器都在运行:

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Sun_Jul_28_19:07:16_PDT_2019
Cuda compilation tools, release 10.1, V10.1.243
这可能是问题所在吗

更新:

以下是输出错误:

113/113 [==============================] - ETA: 0s - loss: 30.0107 - mae: 1.3525
Epoch 00001: val_loss improved from inf to 0.18677, saving model to saved_models/multi_channel_model.h5
Traceback (most recent call last):
  File "fine_tuning.py", line 111, in <module>
    run()
  File "fine_tuning.py", line 104, in run
    model.fit(x=train_x_list, y=train_y, validation_split=0.2,
  File "/home/abderrezzaq/.local/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py", line 108, in _method_wrapper
    return method(self, *args, **kwargs)
  File "/home/abderrezzaq/.local/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py", line 1137, in fit
    callbacks.on_epoch_end(epoch, epoch_logs)
  File "/home/abderrezzaq/.local/lib/python3.8/site-packages/tensorflow/python/keras/callbacks.py", line 412, in on_epoch_end
    callback.on_epoch_end(epoch, logs)
  File "/home/abderrezzaq/.local/lib/python3.8/site-packages/tensorflow/python/keras/callbacks.py", line 1249, in on_epoch_end
    self._save_model(epoch=epoch, logs=logs)
  File "/home/abderrezzaq/.local/lib/python3.8/site-packages/tensorflow/python/keras/callbacks.py", line 1301, in _save_model
    self.model.save(filepath, overwrite=True, options=self._options)
  File "/home/abderrezzaq/.local/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py", line 1978, in save
    save.save_model(self, filepath, overwrite, include_optimizer, save_format,
  File "/home/abderrezzaq/.local/lib/python3.8/site-packages/tensorflow/python/keras/saving/save.py", line 130, in save_model
    hdf5_format.save_model_to_hdf5(
  File "/home/abderrezzaq/.local/lib/python3.8/site-packages/tensorflow/python/keras/saving/hdf5_format.py", line 125, in save_model_to_hdf5
    save_optimizer_weights_to_hdf5_group(f, model.optimizer)
  File "/home/abderrezzaq/.local/lib/python3.8/site-packages/tensorflow/python/keras/saving/hdf5_format.py", line 593, in save_optimizer_weights_to_hdf5_group
    param_dset = weights_group.create_dataset(
  File "/home/abderrezzaq/.local/lib/python3.8/site-packages/h5py/_hl/group.py", line 139, in create_dataset
    self[name] = dset
  File "/home/abderrezzaq/.local/lib/python3.8/site-packages/h5py/_hl/group.py", line 373, in __setitem__
    h5o.link(obj.id, self.id, name, lcpl=lcpl, lapl=self._lapl)
  File "h5py/_objects.pyx", line 54, in h5py._objects.with_phil.wrapper
  File "h5py/_objects.pyx", line 55, in h5py._objects.with_phil.wrapper
  File "h5py/h5o.pyx", line 202, in h5py.h5o.link
RuntimeError: Unable to create link (name already exists)
试试CUDA 10.1。 表示TensorFlow支持CUDA®10.1

ModelCheckpoint回调有问题。检查检查点路径位置是否可写?此外,参考说明如果save_best_only=True,则根据监控数量的最新最佳型号不会被覆盖。所以,您可能希望在每次运行模型时删除最后一个saver模型或在checkpoint_路径中提供新的唯一名称。它很可能会阻止覆盖以前的模型并引发错误

试试CUDA 10.1。 表示TensorFlow支持CUDA®10.1

ModelCheckpoint回调有问题。检查检查点路径位置是否可写?此外,参考说明如果save_best_only=True,则根据监控数量的最新最佳型号不会被覆盖。所以,您可能希望在每次运行模型时删除最后一个saver模型或在checkpoint_路径中提供新的唯一名称。它很可能会阻止覆盖以前的模型并引发错误


当使用几个预先训练的模型实例并通过修改受保护的属性将它们保存到h5时,我能够解决重复变量名导致运行时错误的问题。一般不建议这样做,但在我的情况下,我现在需要一个解决方案,并且不关心将来的校对。我正在CUDA 10.1上使用tensorflow gpu 2.3.0

在编译之前,在创建组合模型my_模型之后,我放置了以下内容。培训和保存检查点的工作如期进行

编辑:请注意,在我的情况下,加载组合模型的h5文件后,如果要再次保存,则必须执行相同的步骤

    for i, w in enumerate(my_model.weights):
        split_name = w.name.split('/')
        new_name = split_name[0] + '_' + str(i) + '/' + split_name[1] + '_' + str(i)
        my_model.weights[i]._handle_name = new_name
在我的案例中,修改组合模型的optimizer.weights(如您提到的建议)没有帮助。我还选择使用load_modelcomile=False加载预先训练的模型,以删除它们的优化器权重


这是我在评论中找到的另一个关于这一点的讨论,有一个类似的解决方案。

我能够解决重复变量名导致运行时错误的问题,当使用几个预先训练的模型实例并通过修改受保护的属性将其保存到h5时。一般不建议这样做,但在我的情况下,我现在需要一个解决方案,并且不关心将来的校对。我正在CUDA 10.1上使用tensorflow gpu 2.3.0

在编译之前,在创建组合模型my_模型之后,我放置了以下内容。培训和保存检查点的工作如期进行

编辑:请注意,在我的情况下,加载组合模型的h5文件后,如果要再次保存,则必须执行相同的步骤

    for i, w in enumerate(my_model.weights):
        split_name = w.name.split('/')
        new_name = split_name[0] + '_' + str(i) + '/' + split_name[1] + '_' + str(i)
        my_model.weights[i]._handle_name = new_name
在我的案例中,修改组合模型的optimizer.weights(如您提到的建议)没有帮助。我还选择使用load_modelcomile=False加载预先训练的模型,以删除它们的优化器权重


这是我在评论中发现的另一个关于这一点的讨论,有一个类似的解决方案。

认真对待兼容性建议。使用CUDA 11+TF 2.30。你处在一个危险的领域。我已经安装了cuda 10.1。nvidia smi提供CUDA版本:11.1,nvcc-Version提供CUDA编译工具,10.1版,V10.1.243。我有点困惑。nvidia smi显示的版本似乎不是安装的版本。现在我确信cuda-10.1安装了tensorflow 2.3.0。我运行代码时,modelcheckpoint似乎不起作用,并给出RuntimeError:无法创建已存在的链接名称modelcheckpoint回调的方法错误。检查检查点路径位置是否可写?还表示如果save_best_only=True,则根据监控数量的最新最佳模型不会被覆盖。因此,每次运行模型时,您可能希望删除最后一个保存器模型或在检查点路径中提供新的唯一名称。请检查此项;这个:拿康普来说
不耐烦的建议。使用CUDA 11+TF 2.30。你处在一个危险的领域。我已经安装了cuda 10.1。nvidia smi提供CUDA版本:11.1,nvcc-Version提供CUDA编译工具,10.1版,V10.1.243。我有点困惑。nvidia smi显示的版本似乎不是安装的版本。现在我确信cuda-10.1安装了tensorflow 2.3.0。我运行代码时,modelcheckpoint似乎不起作用,并给出RuntimeError:无法创建已存在的链接名称modelcheckpoint回调的方法错误。检查检查点路径位置是否可写?还表示如果save_best_only=True,则根据监控数量的最新最佳模型不会被覆盖。因此,每次运行模型时,您可能希望删除最后一个保存器模型或在检查点路径中提供新的唯一名称。请检查此项;这句话是:如果它对我有效,我一定会试试,然后再回来找你。我试过了,它成功了,但它不仅保存了最好的,它保存了所有最好的?很好,它成功了!如果我理解正确的话,你有很多最佳权重的.h5文件。以增量方式保存最佳权重,即每次损失达到新的最小值时,都会保存一个检查点。与您相关的是培训结束前的最后一个。这是ModelCheckpoint的best_only选项的预期行为。是的,在ModelCheckpoint中,我已将save_best_only=True。您的代码现在是否按预期工作?我不确定这是否是一个单独的问题。如果我的答案解决了你的问题,我将感谢你将其标记为已接受:如果它对我有效,我一定会尝试并返回给你。我尝试过,它成功了,但它不仅保存了最好的,它保存了所有最好的?很好,它成功了!如果我理解正确的话,你有很多最佳权重的.h5文件。以增量方式保存最佳权重,即每次损失达到新的最小值时,都会保存一个检查点。与您相关的是培训结束前的最后一个。这是ModelCheckpoint的best_only选项的预期行为。是的,在ModelCheckpoint中,我已将save_best_only=True。您的代码现在是否按预期工作?我不确定这是否是一个单独的问题。如果我的回答解决了您的问题,我将感谢您将其标记为已接受:
    for i, w in enumerate(my_model.weights):
        split_name = w.name.split('/')
        new_name = split_name[0] + '_' + str(i) + '/' + split_name[1] + '_' + str(i)
        my_model.weights[i]._handle_name = new_name