加载模型出现 RuntimeError: Error(s) in loading state_dict for Model: Missing key(s) in state_dict

今天准备加载一个模型来测试的时候发现了一个问题,加载总是失败,报错是RuntimeError: Error(s) in loading state_dict for Model: Missing key(s) in state_dict "convd1.0.weight", "convd1.0.bias", "convd1.1.weight"  。咋一看,难道是因为我取值的问题,然后debug了一下,发现我的state_dict是符合要求的,但是为什么出现加载不了?

问题代码

    model = m.Model()
    checkpoint = torch.load("ckpts/cdnn/model.tar",map_location='cpu')
    state_dict  = checkpoint['state_dict']
    # print(state_dict)
    model.load_state_dict(state_dict)

问题的现象

原因  

加载使用模型时和训练模型时的环境不一致,这个模型是用GPU训练的,我本是使用的是CPU,所以会有些问题

 

解决办法

将load_state_dict(state_dict) 改成  model.load_state_dict(state_dict, False)

分析

 def load_state_dict(self, state_dict, strict=True):
        r"""Copies parameters and buffers from :attr:`state_dict` into
        this module and its descendants. If :attr:`strict` is ``True``, then
        the keys of :attr:`state_dict` must exactly match the keys returned
        by this module's :meth:`~torch.nn.Module.state_dict` function.

        Arguments:
            state_dict (dict): a dict containing parameters and
                persistent buffers.
            strict (bool, optional): whether to strictly enforce that the keys
                in :attr:`state_dict` match the keys returned by this module's
                :meth:`~torch.nn.Module.state_dict` function. Default: ``True``

上面是load_state_dict方法参数的官方说明 strict  参数默认是true,他的含义是 是否严格要求state_dict中的键与该模块的键返回的键匹配

这行代码生效的原理详见load_state_dict中的一段代码

        if strict:
            error_msg = ''
            if len(unexpected_keys) > 0:
                error_msgs.insert(
                    0, 'Unexpected key(s) in state_dict: {}. '.format(
                        ', '.join('"{}"'.format(k) for k in unexpected_keys)))
            if len(missing_keys) > 0:
                error_msgs.insert(
                    0, 'Missing key(s) in state_dict: {}. '.format(
                        ', '.join('"{}"'.format(k) for k in missing_keys)))

        if len(error_msgs) > 0:
            raise RuntimeError('Error(s) in loading state_dict for {}:\n\t{}'.format(
                               self.__class__.__name__, "\n\t".join(error_msgs)))

就是说,如果strict 置为false那么就可以忽略掉报错,请注意是忽略哦!!!

看了这段代码后,我觉得一脸懵逼, 这个属性意思的理解是不是要让我们定义的Model中的键与我们加载模型里面的键严格一致,按理说,这个不是一定要严格一致的吗?不然不匹配乱加载那不是乱套了,但是很神奇的一件事情就是pytorch这个方法设计了一个开关,你可以选择关闭,忽略掉这个异常,不清楚这个是否会影响我们加载的模型的效果,我要验证下!

 

以上是我的胡乱猜想,望大神们批评指教!

### 回答1: 数据框是一种数据结构,类似于电子表格,可以存储和处理二维数据。序列是一种一维数据结构,可以存储一系列的数值或字符。数据处理应用实验闯关是一种实践性的学习方式,通过实际操作来学习数据处理的方法和技巧。在实验闯关中,可以学习如何使用R语言中的数据框和序列定义,以及如何进行数据处理和分析。这种学习方式可以帮助学生更好地理解和掌握数据处理的基本概念和方法。 ### 回答2: 本次数据框、序列定义及数据处理应用实验闯关,主要涉及到Python在数据处理方面的应用。 首先,数据框是Python中最常用的数据结构之一,也是数据分析中最常用的数据结构之一。在本次实验中,我们需要掌握如何使用pandas库其中的DataFrame函数创建数据框,并能对数据框进行相关操作,如筛选、排序以及添加删除数据等操作。 其次,序列定义是Python语言中常用的数据结构,它是由若干个元素组成的。在本次实验中,我们需要扎实掌握序列的创建、切片、索引、替换等操作,以及序列的一些特性,如元素的数据类型、元素的顺序等。 最后,数据处理是本次实验的最终目的,我们需要掌握如何通过Python进行数据的分析处理,如使用pandas库来进行数据的统计分析、数据的可视化展示等操作,以此来提取数据中的规律和有用信息,并为后续的分析决策提供依据。 总的来说,本次实验旨在帮助我们掌握Python在数据处理方面的应用,提升我们的数据分析能力,并为之后的数据分析决策提供重要的支持和指导。 ### 回答3: 数据框、序列定义及数据处理应用实验闯关是一项非常重要的实验任务,其主要目的是通过对数据进行处理和解析,来结合本科生的专业课程和实际应用场景,培养学生的数据分析和处理能力。 首先,数据框是数据分析中最为基础和常用的工具之一,它是一个二维数据结构,可以认为是由多个序列组成的表格。在实验闯关中,我们需要使用数据框来存储和分析数据,例如对某些特定条件下的数据进行筛选、排序、统计等操作。在数据框处理的过程中,我们需要注意数据的质量和完整性,防止出现缺失值、异常值的情况,从而影响实验结果的准确性。 其次,序列定义是将一组数据转换成序列对象,可以对数据进行索引、切片、组合等操作。在实验闯关中,我们需要学习如何使用序列定义来进行数据处理,例如将不同数据类型转换成数组、将多个数组合并成一个数据框等。同时,我们也需要对序列操作的过程中的一些注意事项进行了解,例如不同索引类型的数据合并、重复数据的剔除等。 最后,数据处理应用实验闯关是一个非常实践性的任务,在完成实验过程中,我们需要根据具体的数据需求和分析目的,灵活运用数据框和序列定义的知识,对数据进行加工和转换。例如,我们可以使用 Pandas 库中的自带函数、自主编写函数等方式进行数据的统计、可视化等操作。在此过程中,我们需要注重实践创新和实际应用,将所学的知识运用到实际案例中,从而培养我们对数据的敏感度和理解能力。 综上所述,数据框、序列定义及数据处理应用实验闯关是一项非常重要的实验任务,它可以帮助我们深入理解数据分析的基础知识和实际应用场景,培养我们的数据分析和处理能力,为今后的学习和工作奠定坚实基础。
评论 96
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值