为了账号安全,请及时绑定邮箱和手机立即绑定

TypeError: can't pickle _thread.RLock objects,

TypeError: can't pickle _thread.RLock objects,

慕的地8271018 2022-10-25 11:01:00
我尝试为我的数据集训练 Keras R-FCN,我需要保存完整的模型,因为在完成之前我无法全部训练模型,所以当我可以恢复训练时我需要恢复我的模型。但如果我减轻重量,我无法使用 modelCheckpoint 或 model.save 保存完整模型,只有代码可以正常工作。我使用 TensorFlow-GPU 1.15.0 和 Keras 2.2.4File "/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)在我添加此代码之前,我的模型工作正常并成功保存完整模型
查看完整描述

1 回答

?
呼唤远方

TA贡献1856条经验 获得超11个赞

由于我已经解决了我的问题,我将分享我的解决方案。就像标题所说的错误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):

    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 = input_gt_boxes/image_scale

    return gt_boxes

在我的自定义模型中构建 def 之后,我在 lambda 层中调用它


gt_boxes = KL.Lambda(lambda x: gtBoxes(*x))([input_image, input_gt_boxes])

这个解决方案是我从 TensorFlow GitHub issue 的一个问题中得到的,但我采用了不同的方法,因为即使在使用与该问题的解决方案相同的方法后,我仍然会遇到该错误。


查看完整回答
反对 回复 2022-10-25
  • 1 回答
  • 0 关注
  • 539 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号