keras 使用多GPU数据并行时遇到的问题

问题描述:在keras中,使用多GPU数据并行时,且采用ModelCheckpoint设置检查点,保存训练过程中的权重时,训练完第一个epochs后,报如下错误:
TypeError: can’t pickle thread.lock objects

问题分析:
无法获取线程锁对象,因为,在keras的数据并行机制中,需要用并行的multi_gpu_model()去封装非并行的model(),但是训练时,采用的是multi_gpu_model.fit()的形式,导致保存的模型是并行的模型,而不是非并行的模型。因此,报错。

解决办法:自定义一个回调函数
参考一下链接:https://blog.csdn.net/u012862372/article/details/80367607

本人采用的方法是自定义一个类,继承自ModelCheckpoint()也就是参考链接中的方法二,问题解决。

class ParallelModelCheckpoint(ModelCheckpoint):
    def __init__(self,model,filepath, monitor='val_loss', verbose=0,
                 save_best_only=False, save_weights_only=False,
                 mode='auto', period=1):
        self.single_model = model
        super(ParallelModelCheckpoint,self).__init__(filepath, monitor, verbose,save_best_only, save_weights_only,mode, period)

    def set_model(self, model):
        super(ParallelModelCheckpoint,self).set_model(self.single_model)

check_point = ParallelModelCheckpoint(single_model ,'best.hd5')
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值