You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyTorch实现神经风格迁移计算损失时出现KeyError: 'conv4_2'如何解决

问题原因&修复方案

1 直接触发KeyError的核心问题

get_features 函数的return语句缩进错误,被放在了for循环内部:

for name, layer in model._modules.items():
    x = layer(x)
    if name in layers:
      Features[layers[name]] = x
    return Features # 这里缩进错误,第一次循环就直接返回

程序遍历第一层(name='0')后就直接返回了结果,此时Features字典里只有conv1_1一个键,自然找不到后续的conv4_2。
修复方法:把return语句缩进到和for循环同级,等遍历完所有层后再返回:

def get_features(image,model):
  layers = { 
      '0' : 'conv1_1',
      '5' : 'conv2_1',
      '10' : 'conv3_1',
      '19' : 'conv4_1',
      '21' : 'conv4_2', # content_feature
      '28' : 'conv5_1'
  }
  x  = image 
  Features = {}
  for name, layer in model._modules.items():
    x = layer(x)
    if name in layers:
      Features[layers[name]] = x
  return Features # 修正缩进位置

2 其他隐藏的可运行错误

你的style_loss函数还有三处代码错误,修复完第一个问题后会触发:

  • 变量名拼写错误:参数传入的是style_grams,但代码里写了style_gram[layer]
  • 权重取值错误:style_weights[layers]应该改为style_weights[layer],取当前遍历层的权重
  • return缩进错误:同样放在了for循环内部,只会计算第一层风格损失就返回

修复后的style_loss代码:

def style_loss(style_weights,target_features,style_grams):
  loss = 0
  for layer in style_weights:
    target_f = target_features[layer]
    target_gram = gram_matrix(target_f)
    style_gram = style_grams[layer] # 修正变量名
    b,c,h,w = target_f.shape 
    layer_loss = style_weights[layer]*torch.mean((target_gram-style_gram)**2) # 修正权重取值
    loss += layer_loss/(c*h*w)
  return loss # 修正缩进位置

内容的提问来源于stack exchange,提问作者Rachit S Garg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 18:45:01