TypeError: can't pickle _thread.RLock objects,

我尝试为我的数据集训练 Keras R-FCN,我需要保存完整的模型,因为在完成之前我无法全部训练模型,所以当我可以恢复训练时我需要恢复我的模型。


但如果我减轻重量,我无法使用 modelCheckpoint 或 model.save 保存完整模型,只有代码可以正常工作。


我使用 TensorFlow-GPU 1.15.0 和 Keras 2.2.4


File "/content/testing.py", line 130, in <module>

    ses.run(main())

  File "/content/testing.py", line 123, in main

    layers='all')

  File "/content/KerasRFCN/Model/Model.py", line 546, in train

    use_multiprocessing=False,

  File "/usr/local/lib/python3.6/dist-packages/keras/legacy/interfaces.py", line 91, in wrapper

    return func(*args, **kwargs)

  File "/usr/local/lib/python3.6/dist-packages/keras/engine/training.py", line 1418, in fit_generator

    initial_epoch=initial_epoch)

  File "/usr/local/lib/python3.6/dist-packages/keras/engine/training_generator.py", line 251, in fit_generator

    callbacks.on_epoch_end(epoch, epoch_logs)

  File "/usr/local/lib/python3.6/dist-packages/keras/callbacks.py", line 79, in on_epoch_end

    callback.on_epoch_end(epoch, logs)

  File "/usr/local/lib/python3.6/dist-packages/keras/callbacks.py", line 446, in on_epoch_end

    self.model.save(filepath, overwrite=True)

  File "/usr/local/lib/python3.6/dist-packages/keras/engine/network.py", line 1090, in save

    save_model(self, filepath, overwrite, include_optimizer)

  File "/usr/local/lib/python3.6/dist-packages/keras/engine/saving.py", line 382, in save_model

    _serialize_model(model, f, include_optimizer)

  File "/usr/local/lib/python3.6/dist-packages/keras/engine/saving.py", line 83, in _serialize_model

    model_config['config'] = model.get_config()

  File "/usr/local/lib/python3.6/dist-packages/keras/engine/network.py", line 931, in get_config

    return copy.deepcopy(config)

  File "/usr/lib/python3.6/copy.py", line 150, in deepcopy

    y = copier(x, memo)


这是问题代码:


    h, w = K.shape(input_image)[1], K.shape(input_image)[2]

    image_scale = K.cast(K.stack([h, w, h, w], axis=0), tf.float32)

    gt_boxes = KL.Lambda(lambda x: x / image_scale)(input_gt_boxes)

在我添加此代码之前,我的模型工作正常并成功保存完整模型


慕的地8271018
浏览 540回答 1
1回答

呼唤远方

由于我已经解决了我的问题,我将分享我的解决方案。就像标题所说的错误typeError: can't pickle thread rlock object显然是因为我的模型中有原始张量在内部游荡,在这种情况下,在我的自定义模型中构建的 def 内部。我采取的解决方案是制作一个包含计算的函数,其中涉及 k.shape 并在 lambda 层内调用该函数。这是我采用的示例解决方案。这是问题代码h, w = K.shape(input_image)[1], K.shape(input_image)[2]image_scale = K.cast(K.stack([h, w, h, w], axis=0), "float32")gt_boxes = KL.lambda(lambda x: x/image_scale)(input_gt_boxes)然后我将该代码移动到一个函数中def gtBoxes(input_image, input_gt_boxes):&nbsp; &nbsp; h, w = K.shape(input_image)[1], K.shape(input_image)[2]&nbsp; &nbsp; image_scale = K.cast(K.stack([h, w, h, w], axis=0), "float32")&nbsp; &nbsp; gt_boxes = input_gt_boxes/image_scale&nbsp; &nbsp; return gt_boxes在我的自定义模型中构建 def 之后,我在 lambda 层中调用它gt_boxes = KL.Lambda(lambda x: gtBoxes(*x))([input_image, input_gt_boxes])这个解决方案是我从 TensorFlow GitHub issue 的一个问题中得到的,但我采用了不同的方法,因为即使在使用与该问题的解决方案相同的方法后,我仍然会遇到该错误。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python