KeyError: unexpected key model.model.1.model.3.model.3.model.3.model.3.model.3.model.2.running_mea

 

代码如下:

def load_ae(self, network):
        pdb.set_trace()

        save_filename = 'latest_net_AE.pth'
        save_path = os.path.join(self.save_dir, save_filename)
        network.load_state_dict(torch.load(save_path))

报错:

KeyError: 'unexpected key "model.model.1.model.3.model.3.model.3.model.3.model.3.model.2.running_mean" in state_dict'

按照网上的解决方案(https://discuss.pytorch.org/t/solved-keyerror-unexpected-key-module-encoder-embedding-weight-in-state-dict/1686/3), 解释的报错原因是保存模型时使用了nn.DataParallel,导致存储参数里多了.model;但load的时候没有使用nn.DataParallel。

"You probably saved the model using nn.DataParallel, which stores the model in module, and now you are trying to load it without DataParallel. You can either add a nn.DataParallel temporarily in your network for loading purposes, or you can load the weights file, create a new ordered dict without the module prefix, and load it back."

并根据上述网址的答案将代码改为:

    def load_ae(self, network):
        pdb.set_trace()

        save_filename = 'latest_net_AE.pth'
        save_path = os.path.join(self.save_dir, save_filename)
        # network.load_state_dict(torch.load(save_path))

        # original saved file with DataParallel
        state_dict = torch.load(save_path)
        # create new OrderedDict that does not contain `module.`
        from collections import OrderedDict
        new_state_dict = OrderedDict()
        for k, v in state_dict.items():
            name = k.replace(".module","")  # remove `module.`
            new_state_dict[name] = v
        # load params
        network.load_state_dict(new_state_dict)

然而,还是会报错:

  File "/share2/home/ruixu/DeepLearningLCT/DeblurGAN-master/AEOT_Unet/models/base_model.py", line 70, in load_ae
    name = k.replace(".module","")  # remove `module.`
  File "/share2/home/ruixu/anaconda3/envs/python36/lib/python3.6/site-packages/torch/nn/modules/module.py", line 522, in load_state_dict
    .format(name))
KeyError: 'unexpected key "model.model.1.model.3.model.3.model.3.model.3.model.3.model.2.running_mean" in state_dict'

万万没想到错误竟然会一模一样!但报错的位置竟然是name = k.replace(".module","")  # remove `module.`。

 

还是一步一步来解决吧。

 

首先,输出network.state_dict()

... ....

 ('model.model.3.weight',
( 0 , 0 ,.,.) =
1.00000e-02 *
 -1.2084 -2.2976 -2.8284 -1.5688
  3.0504 -0.1078 -1.6116 -6.6927
 -1.2499  1.8116  0.3322  1.9724
 -2.9073  4.4396  2.2341 -0.2121

 

(127, 2 ,.,.) =
1.00000e-02 *
  3.9328 -0.4361  1.6365 -3.3506
 -0.8479 -1.9702 -2.2223  1.9633
  2.9766 -0.4350 -0.2136 -2.5228
  2.0793 -3.1964 -0.3516  3.7284
[torch.cuda.FloatTensor of size 128x3x4x4 (GPU 3)]
), ('model.model.3.bias',
 0
 0
 0
[torch.cuda.FloatTensor of size 3 (GPU 3)]
)])

接下来,load训练好的权重后将其输出:

... ....

 ('model.model.3.weight',
( 0 , 0 ,.,.) =
1.00000e-02 *
 -4.7173 -1.7712  0.5993  1.4681
  2.1384  1.6073  2.7149 -4.4520
 -0.9415 -1.0043 -2.8195  1.4755
 -1.7620  2.9188 -0.9800 -1.5442

...

(127, 2 ,.,.) =
1.00000e-02 *
  0.5911  1.2228 -4.6552 -0.9199
  0.1930  0.9382 -0.1070 -0.5980
  0.5762  2.1807  3.0031 -1.0809
  0.2351 -0.3915  0.1441 -1.6821
[torch.FloatTensor of size 128x3x4x4]
), ('model.model.3.bias',
1.00000e-03 *
 -1.8013
 -1.7175
 -5.1277
[torch.FloatTensor of size 3]
)])

仅从最后两个元素来看一摸一样!那么问题是出在哪里呢?

根据报错内容KeyError: 'unexpected key "model.model.1.model.3.model.3.model.3.model.3.model.3.model.2.running_mean" in state_dict',那就看看两个state_dict的所有key分别是什么:

先输出要load的训练好的网络的权重state_weight的所有keys:

(Pdb) print('\n'.join(map(str,sorted(state_dict.keys()))))

  1. model.model.0.bias
  2. model.model.0.weight
  3. model.model.1.model.1.bias
  4. model.model.1.model.1.weight
  5. model.model.1.model.2.running_mean
  6. model.model.1.model.2.running_var
  7. model.model.1.model.3.model.1.bias
  8. model.model.1.model.3.model.1.weight
  9. model.model.1.model.3.model.2.running_mean
  10. model.model.1.model.3.model.2.running_var
  11. model.model.1.model.3.model.3.model.1.bias
  12. model.model.1.model.3.model.3.model.1.weight
  13. model.model.1.model.3.model.3.model.2.running_mean
  14. model.model.1.model.3.model.3.model.2.running_var
  15. model.model.1.model.3.model.3.model.3.model.1.bias
  16. model.model.1.model.3.model.3.model.3.model.1.weight
  17. model.model.1.model.3.model.3.model.3.model.2.running_mean
  18. model.model.1.model.3.model.3.model.3.model.2.running_var
  19. model.model.1.model.3.model.3.model.3.model.3.model.1.bias
  20. model.model.1.model.3.model.3.model.3.model.3.model.1.weight
  21. model.model.1.model.3.model.3.model.3.model.3.model.2.running_mean
  22. model.model.1.model.3.model.3.model.3.model.3.model.2.running_var
  23. model.model.1.model.3.model.3.model.3.model.3.model.3.model.1.bias
  24. model.model.1.model.3.model.3.model.3.model.3.model.3.model.1.weight
  25. model.model.1.model.3.model.3.model.3.model.3.model.3.model.2.running_mean
  26. model.model.1.model.3.model.3.model.3.model.3.model.3.model.2.running_var
  27. model.model.1.model.3.model.3.model.3.model.3.model.3.model.3.model.1.bias
  28. model.model.1.model.3.model.3.model.3.model.3.model.3.model.3.model.1.weight
  29. model.model.1.model.3.model.3.model.3.model.3.model.3.model.3.model.3.bias
  30. model.model.1.model.3.model.3.model.3.model.3.model.3.model.3.model.3.weight
  31. model.model.1.model.3.model.3.model.3.model.3.model.3.model.3.model.4.running_mean
  32. model.model.1.model.3.model.3.model.3.model.3.model.3.model.3.model.4.running_var
  33. model.model.1.model.3.model.3.model.3.model.3.model.3.model.5.bias
  34. model.model.1.model.3.model.3.model.3.model.3.model.3.model.5.weight
  35. model.model.1.model.3.model.3.model.3.model.3.model.3.model.6.running_mean
  36. model.model.1.model.3.model.3.model.3.model.3.model.3.model.6.running_var
  37. model.model.1.model.3.model.3.model.3.model.3.model.5.bias
  38. model.model.1.model.3.model.3.model.3.model.3.model.5.weight
  39. model.model.1.model.3.model.3.model.3.model.3.model.6.running_mean
  40. model.model.1.model.3.model.3.model.3.model.3.model.6.running_var
  41. model.model.1.model.3.model.3.model.3.model.5.bias
  42. model.model.1.model.3.model.3.model.3.model.5.weight
  43. model.model.1.model.3.model.3.model.3.model.6.running_mean
  44. model.model.1.model.3.model.3.model.3.model.6.running_var
  45. model.model.1.model.3.model.3.model.5.bias
  46. model.model.1.model.3.model.3.model.5.weight
  47. model.model.1.model.3.model.3.model.6.running_mean
  48. model.model.1.model.3.model.3.model.6.running_var
  49. model.model.1.model.3.model.5.bias
  50. model.model.1.model.3.model.5.weight
  51. model.model.1.model.3.model.6.running_mean
  52. model.model.1.model.3.model.6.running_var
  53. model.model.1.model.5.bias
  54. model.model.1.model.5.weight
  55. model.model.1.model.6.running_mean
  56. model.model.1.model.6.running_var
  57. model.model.3.bias
  58. model.model.3.weight

再输出netowrk的所有初始权重:

(Pdb) print('\n'.join(map(str,sorted(network.state_dict().keys()))))

  1. model.model.0.bias
  2. model.model.0.weight
  3. model.model.1.model.1.bias
  4. model.model.1.model.1.weight
  5. model.model.1.model.2.running_mean
  6. model.model.1.model.2.running_var
  7. model.model.1.model.3.model.1.bias
  8. model.model.1.model.3.model.1.weight
  9. model.model.1.model.3.model.2.running_mean
  10. model.model.1.model.3.model.2.running_var
  11. model.model.1.model.3.model.3.model.1.bias
  12. model.model.1.model.3.model.3.model.1.weight
  13. model.model.1.model.3.model.3.model.2.running_mean
  14. model.model.1.model.3.model.3.model.2.running_var
  15. model.model.1.model.3.model.3.model.3.model.1.bias
  16. model.model.1.model.3.model.3.model.3.model.1.weight
  17. model.model.1.model.3.model.3.model.3.model.2.running_mean
  18. model.model.1.model.3.model.3.model.3.model.2.running_var
  19. model.model.1.model.3.model.3.model.3.model.3.model.1.bias
  20. model.model.1.model.3.model.3.model.3.model.3.model.1.weight
  21. model.model.1.model.3.model.3.model.3.model.3.model.2.running_mean
  22. model.model.1.model.3.model.3.model.3.model.3.model.2.running_var
  23. model.model.1.model.3.model.3.model.3.model.3.model.3.model.1.bias
  24. model.model.1.model.3.model.3.model.3.model.3.model.3.model.1.weight
  25. model.model.1.model.3.model.3.model.3.model.3.model.3.model.3.bias
  26. model.model.1.model.3.model.3.model.3.model.3.model.3.model.3.weight
  27. model.model.1.model.3.model.3.model.3.model.3.model.3.model.4.running_mean
  28. model.model.1.model.3.model.3.model.3.model.3.model.3.model.4.running_var
  29. model.model.1.model.3.model.3.model.3.model.3.model.5.bias
  30. model.model.1.model.3.model.3.model.3.model.3.model.5.weight
  31. model.model.1.model.3.model.3.model.3.model.3.model.6.running_mean
  32. model.model.1.model.3.model.3.model.3.model.3.model.6.running_var
  33. model.model.1.model.3.model.3.model.3.model.5.bias
  34. model.model.1.model.3.model.3.model.3.model.5.weight
  35. model.model.1.model.3.model.3.model.3.model.6.running_mean
  36. model.model.1.model.3.model.3.model.3.model.6.running_var
  37. model.model.1.model.3.model.3.model.5.bias
  38. model.model.1.model.3.model.3.model.5.weight
  39. model.model.1.model.3.model.3.model.6.running_mean
  40. model.model.1.model.3.model.3.model.6.running_var
  41. model.model.1.model.3.model.5.bias
  42. model.model.1.model.3.model.5.weight
  43. model.model.1.model.3.model.6.running_mean
  44. model.model.1.model.3.model.6.running_var
  45. model.model.1.model.5.bias
  46. model.model.1.model.5.weight
  47. model.model.1.model.6.running_mean
  48. model.model.1.model.6.running_var
  49. model.model.3.bias
  50. model.model.3.weight

一个50一个58!!竟然不一样!

经过进一步检查代码就发现了问题:

竟然是因为权重用的是downsample*256的UNet而网络是downsample*128的UNet........

 

把这个问题改了问题成功解决。

 

总结

虽然最后是一个乌龙,但发现这个乌龙的过程还是颇有意义的。

 

<think>好的,我现在需要处理用户关于网站意外错误的解决方案的查询。首先,用户提到了几个引用,其中引用[1]是关于Edit.cshtml页面上的错误,引用[2]解释APIError的原因,引用[3]提供了添加隐藏字段的解决方案。用户现在想寻找网站意外错误的通用解决方案,需要结合这些引用内容。 首先,我应该按照用户的要求,结构清晰地分步骤解答问题。需要确保使用中文,数学公式正确,并且生成相关问题。同时,引用的内容需要在回答中自然地标注。 第一步,整理常见原因。根据引用[2],APIError可能是服务器端的问题,比如临时错误或系统中断。另外,引用[1]和[3]提到的数据库操作问题也是可能的原因。所以需要将服务器错误、数据库问题、客户端输入验证、代码逻辑错误和第三方服务问题列为常见原因。 接下来,分步解决方案。引用[3]中的解决方案是添加隐藏字段,这可能涉及数据库并发控制,所以需要提到检查数据库操作,使用EF Core的并发令牌。此外,用户应检查服务器状态(引用[2]提到的系统状态页面),验证输入数据,查看日志,以及处理第三方API错误。 然后,代码示例部分需要展示如何在Edit.cshtml中添加隐藏字段,如引用[3]所示。同时,可能需要展示后端处理并发异常的代码,比如使用try-catch块。 预防措施方面,监控、测试、输入验证和错误处理中间件都是关键点,需要提及。 最后,生成的相关问题需要覆盖具体的错误场景、处理APIError、数据库并发问题、日志分析和预防措施。 需要确保所有引用在回答中正确标注,比如在提到服务器端问题时引用[2],在数据库操作部分引用[3]。同时,数学公式如果有的话要用正确的LaTeX格式,但当前问题可能不涉及数学表达式,所以可能不需要。但需检查是否有需要的地方。 现在检查结构是否清晰,是否覆盖了所有用户提供的引用内容,并自然地添加了引用标识。确保没有遗漏关键点,语言通顺,步骤明确。</think>### 网站意外错误的解决方案 网站意外错误可能由多种原因引起,以下是分步解决方案和关键排查方向: --- #### **1. 常见原因分析** - **服务器端问题**:临时错误、代码逻辑漏洞或系统资源不足(如数据库连接超时)[^2]。 - **数据库操作异常**:例如并发修改导致的数据不一致(如`Store update, insert, or delete statement affected an unexpected number of rows`)[^3]。 - **客户端输入验证缺失**:未过滤非法参数或表单数据不完整。 - **第三方服务故障**:依赖的API或外部服务不可用[^2]。 --- #### **2. 分步解决方案** **步骤1:检查服务器状态与日志** - 查看系统状态页面确认是否为平台级故障。 - 分析服务器日志(如ASP.NET的`Event Viewer`或云服务的日志控制台),定位错误堆栈信息。 **步骤2:验证数据库操作** - **并发控制**:在数据编辑页面(如`Edit.cshtml`)添加隐藏字段`@Html.HiddenFor(model => model.RowVersion)`,结合EF Core的并发令牌机制[^3]。 - **事务回滚**:确保数据库操作在事务中执行,避免部分失败导致数据不一致。 **步骤3:强化输入验证** ```html <!-- 前端验证示例 --> @Html.ValidationSummary(true) @Html.LabelFor(model => model.Name) @Html.EditorFor(model => model.Name) @Html.ValidationMessageFor(model => model.Name) ``` **步骤4:处理第三方API错误** - 实现重试机制(如指数退避算法)和熔断模式(如Polly库): ```csharp var retryPolicy = Policy .Handle<APIError>() .WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))); ``` **步骤5:代码逻辑审查** - 检查模型绑定是否正确,避免`Edit.cshtml`中字段缺失(如`CourseId`未绑定)。 --- #### **3. 代码示例:修复数据库并发错误** ```html <!-- Edit.cshtml 中添加隐藏字段 --> @Html.HiddenFor(model => model.CourseId) @Html.HiddenFor(model => model.RowVersion) ``` ```csharp // 后端使用并发令牌 public class Course { [Key] public int CourseId { get; set; } [ConcurrencyCheck] public byte[] RowVersion { get; set; } } ``` --- #### **4. 预防措施** - **监控与告警**:使用Application Insights或Sentry实时监控异常。 - **单元测试**:覆盖核心功能(如数据提交、API调用)。 - **输入验证**:前后端双重校验(如FluentValidation库)。 - **全局错误处理**: ```csharp // ASP.NET Core中间件 app.UseExceptionHandler(errorApp => { errorApp.Run(async context => { context.Response.StatusCode = 500; await context.Response.WriteAsync("发生意外错误,请稍后重试。"); }); }); ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不再更新,请勿购买!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值