当前位置: 首页 > news >正文

错误处理_IncompatibleKeys

错误重现

Exception has occurred: AttributeError
'_IncompatibleKeys' object has no attribute 'act'
File "E:\pycharm\python_doc\learntoconverse_reconstructed\utils.py", line 356, in <listcomp>
results = [async_result.get() for async_result in async_results]
File "E:\pycharm\python_doc\learntoconverse_reconstructed\utils.py", line 356, in rollout_workers
results = [async_result.get() for async_result in async_results]
File "E:\pycharm\python_doc\learntoconverse_reconstructed\train.py", line 65, in <module>
results = rollout_workers(envs_s=envs, epsilon_table=epsilon_table, original_policy=policy, config=config)
AttributeError: '_IncompatibleKeys' object has no attribute 'act'

错误分析

这个错误表明当尝试调用 policy.act() 方法时,传入的 policy 对象实际上是一个 _IncompatibleKeys 对象(这是 PyTorch 在 load_state_dict() 失败时返回的对象),而不是预期的 AttentionPolicy 实例。

问题分析

  1. 错误根源

    • rollout_workers 函数中,这一行代码有问题:
      copy.deepcopy(original_policy_copy).load_state_dict(add_state_dict(...))
      
    • load_state_dict() 返回的是 _IncompatibleKeys 对象(当状态字典不匹配时),而不是模型本身
  2. 具体问题

    • 直接使用了 load_state_dict() 的返回值作为 policy 对象
    • 应该先加载状态字典,然后返回模型实例

解决方案

修改 rollout_workers 函数如下:

def rollout_workers(envs_s:list, epsilon_table:list, original_policy:AttentionPolicy, config:Config):num_task = config.evaluate_time + config.n_directionsnum_worker = config.num_workerresults = []original_policy_copy = copy.deepcopy(original_policy).to("cpu")with Pool(processes=num_worker) as pool:epsilon_ids = range(num_task)async_results = []for i in epsilon_ids:# 创建policy副本policy_copy = copy.deepcopy(original_policy_copy)# 如果是扰动方向,加载扰动后的参数if i < config.n_directions:# 获取扰动后的state_dictperturbed_state_dict = add_state_dict(policy_copy.state_dict(),epsilon_table[i],"cpu")# 加载参数但不使用返回值policy_copy.load_state_dict(perturbed_state_dict)# 提交任务async_results.append(pool.apply_async(rollout_envs,args=(envs_s[i],policy_copy,  # 这里传入的是模型实例,不是load_state_dict的返回值config,i)))results = [async_result.get() for async_result in async_results]return results

关键修改点

  1. 分离模型复制和参数加载

    • 先创建模型副本 policy_copy = copy.deepcopy(original_policy_copy)
    • 然后单独加载参数 policy_copy.load_state_dict(perturbed_state_dict)
  2. 正确处理返回值

    • 不再使用 load_state_dict() 的返回值
    • 直接传递模型实例 policy_copyrollout_envs
  3. 更清晰的流程

    • 使用显式的循环而不是列表推导式,提高可读性
    • 分离扰动参数的应用和任务提交

为什么原代码会失败

PyTorch 的 load_state_dict() 方法在遇到不匹配的键时会返回 _IncompatibleKeys 对象(包含 missing_keysunexpected_keys),而不是模型本身。当后续代码尝试调用这个返回对象的 act() 方法时,就会抛出 AttributeError

这个修改确保了始终传递正确的模型实例给工作进程,同时保持了原有的功能逻辑。

http://www.dtcms.com/a/312021.html

相关文章:

  • 在Linux上对固态硬盘进行分区、格式化和挂载的步骤
  • CH32V单片机启用 FPU 速度测试
  • MVVM——ArkUI的UI开发模式
  • 使用Python开发Ditto剪贴板数据导出工具
  • 使用C++实现日志(2)
  • MCP终极指南 - 从原理到实战(基础篇)
  • 面试实战,问题二十二,Java JDK 17 有哪些新特性,怎么回答
  • windows内核研究(软件调试-异常的处理流程)
  • 幂等性介绍和下单接口幂等性保证实现方案
  • 雷卯针对香橙派Orange Pi RV2开发板防雷防静电方案
  • kotlin小记(1)
  • Waterfox水狐浏览器、火狐浏览器外观修改
  • Dice Combinations(Dynamic Programming)
  • 【Bug记录】关于copy的表不能copy主键和index的解决办法
  • python:以支持向量机(SVM)为例,通过调整正则化参数C和核函数类型来控制欠拟合和过拟合
  • SM2椭圆曲线密码算法原理与纯C语言实现详解
  • #Linux内存管理# 用一个案例详细介绍ARMv7-A架构 缺页中断处理的原理
  • ARMv8/v9架构FAR_EL3寄存器介绍
  • imx6ull-驱动开发篇6——Linux 设备树语法
  • P10816 [EC Final 2020] Namomo Subsequence|普及+
  • 堆----1.数组中的第K个最大元素
  • [buuctf-misc]喵喵喵
  • Linux学习--数据结构
  • 前端-移动Web-day3
  • 基于springboot的郑州旅游景点推荐系统
  • Kotlin单例模式懒汉模式:LazyThreadSafetyMode.SYNCHRONIZED(2)
  • 多线程(二) ~ 线程核心属性与状态
  • C#中对于List的多种排序方式
  • LeeCode 88. 合并两个有序数组
  • DeepSpeed - 超大LLM分布式训练框架 ZeRO技术