解决AttributeError: ‘DataParallel‘ object has no attribute ‘xxxx‘

news2024/11/14 11:24:38

问题描述

训练模型时,分阶段训练,第二阶段加载第一阶段训练好的模型的参数,接着训练
第一阶段训练,含有代码

    if (train_on_gpu):
        if torch.cuda.device_count() > 1:
            net = nn.DataParallel(net)
        net = net.to(device)

第二阶段训练,含有代码

    if (train_on_gpu):
        if torch.cuda.device_count() > 1:
            netT = nn.DataParallel(netT)
            netS = nn.DataParallel(netS)
        netT = netT.to(device)
        netS = netS.to(device)
-----
    orig_state_dict = torch.load("../models/model.pth")['net']
    new_state_dict = OrderedDict()
    for k, v in orig_state_dict.items():
        name = k.replace('module.', '')
        new_state_dict[name] = v
    netT.load_state_dict(new_state_dict)
-----    
    for param in netS.parameters():
        param.requires_grad = True
    #对源模型 netS 的 pose_fc1 层所有参数都设置为不需要进行反向传播更新。
    for param in netS.pose_fc1.parameters():
        param.requires_grad = False

结果报错

RuntimeError: Error(s) in loading state_dict for DataParallel: Missing key(s) in state_dict: "module.feat.block1.layer.0.conv1.weight", ...........

解决方案:

注释掉nn.DataParallel()

    if (train_on_gpu):
        if torch.cuda.device_count() > 1:
        	pass
            #netT = nn.DataParallel(netT)
            #netS = nn.DataParallel(netS)
        netT = netT.to(device)
        netS = netS.to(device)
-----
    orig_state_dict = torch.load("../models/model.pth")['net']
    new_state_dict = OrderedDict()
    for k, v in orig_state_dict.items():
        name = k.replace('module.', '')
        new_state_dict[name] = v
    netT.load_state_dict(new_state_dict)
-----    
    for param in netS.parameters():
        param.requires_grad = True
    #对源模型 netS 的 pose_fc1 层所有参数都设置为不需要进行反向传播更新。
    for param in netS.pose_fc1.parameters():
        param.requires_grad = False

原因分析

可能是模型在第一阶段和第二阶段训练设置不一致导致的问题,比如第一阶段用双卡训练,第二阶段用单卡训练
这时不能第一阶段和第二阶段都用nn.DataParallel()

net加载的网络结构没有"module",而第一阶段保存的模型因为使用了net = nn.DataParallel(net),保存的参数的key有"module",
这个时候如果我们执行 netT.load_state_dict(new_state_dict)
会报错missing keys .....Unexpected key(s) in state_dict: "module.features.......
于是按网络教程加一个False, netT.load_state_dict(new_state_dict,False)
于是就报错题目中的问题了解决AttributeError: ‘DataParallel‘ object has no attribute ‘xxxx‘
在这里实际上第二阶段加载的时候就要把key前面的"module"去掉,才能正确加载模型参数到网络里面,继续训练
另外注释掉nn.DataParallel()即可

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/818996.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

苍穹外卖黑马1

苍穹外卖项目(12天)分布如下: 第一章:环境搭建(1天) day01:项目概述、环境搭建 第二章:基础数据维护(3天) day02:员工管理、分类管理 day03: 菜品…

React哲学——官方示例

在本篇技术博客中,我们将介绍React官方示例:React哲学。我们将深入探讨这个示例中使用的组件化、状态管理和数据流等核心概念。让我们一起开始吧! 项目概览 React是一个流行的JavaScript库,用于构建用户界面。React的设计理念是…

C++多态(2) ——抽象类与final、override关键字

目录 一.抽象类 1.定义 2.形式 3.举例: 解决方法:让子类重写纯虚函数,重写后子类就会变换为具体类,能够创建出对象了。 3.抽象类的作用 二.final与override关键字 方法1:私有父类构造函数 方法2:私有…

Linux - 进程控制(创建和终止)

1.进程创建 fork函数初识 在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。 返回值:子进程返回0,父进程返回子进程id,出错返回-1 getpid()获取子进程id&#xf…

JVM、Redis、反射

JVM JVM是Java virtual machine(Java虚拟机)的缩写,是一种用于计算机的规范,是通过在实际计算机上仿真模拟各种计算机功能来实现的。 主要组件构成: 1.类加载器 子系统负责从文件系统或者网络中加载Class文件&…

分布式文件存储与数据缓存 Redis高可用分布式实践(下)

六、Redisweb实践 网页缓存 1.创建springboot项目 2.选择组件 Lombok spring mvc spring data redis spring data jpa 3.编写配置文件 ### 数据库访问配置 spring.datasource.driver-class-namecom.mysql.jdbc.Driver spring.datasource.urljdbc:mysql://192.168.66.100:3307/…

uniapp scroll-view显示滚动条

在style中添加样式: ::v-deep ::-webkit-scrollbar {/* 滚动条整体样式 */display: block;width: 10rpx !important;height: 10rpx !important;-webkit-appearance: auto !important;background: transparent;overflow: auto !important;}::v-deep ::-webkit-scroll…

matlab使用教程(6)—线性方程组的求解

进行科学计算时,最重要的一个问题是对联立线性方程组求解。在矩阵表示法中,常见问题采用以下形式:给定两个矩阵 A 和 b,是否存在一个唯一矩阵 x 使 Ax b 或 xA b? 考虑一维示例具有指导意义。例如,方程 …

测试|自动化测试(了解)

测试|自动化测试(了解) 1.什么是自动化测试☆☆☆☆ 自动化测试相当于把人工测试手段进行转换,让代码执行。 2.自动化测试的分类☆☆☆☆ 注:这里只是常见的自动化测试,并不全部罗列。 1.单元自动化测试 其中Java…

分布式开源监控Zabbix实战

Zabbix作为一个分布式开源监控软件,在传统的监控领域有着先天的优势,具备灵活的数据采集、自定义的告警策略、丰富的图表展示以及高可用性和扩展性。本文简要介绍Zabbix的特性、整体架构和工作流程,以及安装部署的过程,并结合实战…

数据结构 | Radix Tree 树

什么是基数树? 基数树是一种多叉搜索树,数据位于叶子节点上,每一个节点有固定的2^n个子节点(n为划分的基大小,当n为1时,为二叉树)。 什么为划分的基? 以一个64位的长整型为例&#x…

oracle 19c打补丁遭遇OPATCHAUTO-72043OPATCHAUTO-68061

最近,在AIX上的新装oracle 19C数据库基础版本,使用opatchauto打PSU补丁集35037840时遇到了OPATCHAUTO-72043报错,无法正常应用GI补丁。 一、环境描述 操作系统:AIX 数据库版本:oracle rac 19.3.0新装基础版 应用PS…

代码随想录第四十八天|198、213、337.打家劫舍

198.打家劫舍 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个…

【JAVASE】重载与递归

⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 📀 收录专栏:浅谈java 💖 持续更文,关注博主少走弯路,谢谢大家支持 💖 重载与递归 1. 方法重载1.1 为什么需要方…

开源代码分享(9)—面向100%清洁能源的发输电系统扩展规划(附matlab代码)

1.背景介绍 1.1摘要 本文提出了一种新颖的建模框架和基于分解的解决策略,将随机规划(SP)和鲁棒优化(RO)相结合,以应对协调中长期电力系统规划中的多重不确定性。从独立系统运营商(ISO&#xff…

CAD曲面建模

首先还是要在3d绘图的环境中进行 在网络菜单栏的左侧,有曲面建模相关的功能 包括旋转形成曲面、平移形成曲面,按照两条线形成网格,按照四条封闭的线形成曲面等等 首先演示旋转曲面 需要被旋转的对象,以及旋转轴 首先选择要旋转…

Leetcode | DP | 338. 198. 139.

338. Counting Bits 重点在于这张图。 从i1开始,dp的array如果i是2的1次方之前的数,是1 dp[i - 2 ^ 0]; 如果i是2的2次方之前的数,是1 dp[i - 2 ^ 1]; 如果i是2的3次方之前的数,是1 dp[i - 2 ^ 2]; 198. House Robber 如果…

Hadoop学习指南:探索大数据时代的重要组成——Hadoop运行模式(下)

Hadoop运行模式(下) 前言2.6 配置历史服务器1)配置mapred-site.xml2)分发配置3)在hadoop102启动历史服务器4)查看历史服务器是否启动5)查看JobHistory 2.7 配置日志的聚集1)配置yarn-site.xml2&…

【ChatGPT辅助学Rust | 基础系列 | Rust初相识】Rust简介与环境配置

教程目录 前言一,Rust简介1,Rust的历史2,Rust的特性3,为什么选择Rust4,Rust可以做什么 二, Rust环境配置1,windows11安装2,Linux安装 三,安装IDE 前言 Rust是一种系统编…

智慧水务配电能效系统的开发与功能介绍

随着城市化进程的步伐大大变快,城市建设与科学信息技术的融合程度也在不断提升,尤其是大数据信息技术的迅猛发展,为民生工程由信息化向智能化转型提供了条件。以城市的水务系统为例,依托大数据信息技术构建智慧水务系统是智慧城市…