关于python网络编程pickle 中 unpickling error 处理

博客指出在Python网络编程接收端设置接收数据数量时,使用变量会报错。如'receiver = serverSocket.recvfrom(mss)',需将变量mss(最大报文段长度)改为具体数量,像'receiver = serverSocket.recvfrom(1024)'。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在接收端要设置接收数据的数量,如果用变量将会报错:
例如:receiver = serverSocket.recvfrom(mss) 要将变量mss(最大报文段长度)改成具体数量
如: receiver = serverSocket.recvfrom(1024)

### 解决方案概述 当遇到 `_pickle.UnpicklingError` 错误时,通常是因为保存模型权重的文件损坏或者不兼容引起的。以下是针对该问题的具体分析以及两种解决方案。 --- #### 方法一:验证并重新生成权重文件 如果 `torch.load` 抛出了 `_pickle.UnpicklingError` 错误,则可能是由于以下原因造成的: - 权重文件可能被截断或损坏。 - 文件格式与当前 PyTorch 版本不匹配。 为了修复此问题,可以尝试以下操作: 1. **确认文件完整性** 验证 `.pth` 或 `.pt` 文件是否完整下载或传输过程中未发生数据丢失。可以通过比较文件大小或校验和来完成这一过程[^1]。 2. **重新导出模型权重** 如果有权访问原始训练脚本,建议重新保存模型权重。确保使用最新的 PyTorch 版本来保存模型,并指定协议版本以提高兼容性: ```python torch.save(model.state_dict(), 'model_weights.pth', _use_new_zipfile_serialization=True) ``` 3. **降级/升级 PyTorch 版本** 不同版本的 PyTorch 可能存在序列化差异。如果无法更改权重文件来源,考虑调整本地环境中的 PyTorch 版本至与权重文件一致的版本。 --- #### 方法二:处理分布式训练导致的关键字前缀问题 即使解决了 `_pickle.UnpicklingError`,仍可能出现因多 GPU 训练引入的 `"module."` 前缀而导致的 key mismatch 问题。这种情况下可采取如下措施: 1. **移除多余前缀** 使用 Python 字典推导式删除多余的 `"module."` 前缀后再加载权重: ```python from collections import OrderedDict checkpoint = torch.load('model_weights.pth') new_checkpoint = OrderedDict() for k, v in checkpoint.items(): name = k.replace("module.", "") # 移除 "module." new_checkpoint[name] = v model.load_state_dict(new_checkpoint) ``` 2. **修改加载方式** 若模型是在单卡环境中运行而无需额外封装到 `nn.DataParallel` 中,则可以直接通过忽略键名的方式加载部分参数: ```python incompatible_keys = model.load_state_dict(checkpoint, strict=False) print(incompatible_keys.missing_keys) # 打印缺失的 keys print(incompatible_keys.unexpected_keys) # 打印意外的 keys ``` 上述方法能够有效应对由分布式训练引发的命名冲突问题。 --- ### 总结代码示例 综合以上两种情况下的解决办法,提供一段完整的代码供参考: ```python import torch from collections import OrderedDict try: checkpoint = torch.load('model_weights.pth') # 尝试加载权重 except Exception as e: print(f"Load error: {e}") # 处理 UnpicklingError 的一种简单策略——重新下载或替换权重文件 raise ValueError("Please ensure the integrity of your weight file and try again.") # 检查是否存在 module. 前缀问题 if list(checkpoint.keys())[0].startswith("module."): new_checkpoint = OrderedDict() for k, v in checkpoint.items(): name = k.replace("module.", "") new_checkpoint[name] = v model.load_state_dict(new_checkpoint) else: model.load_state_dict(checkpoint) print("Model weights loaded successfully.") ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值