CFNet训练加载Mish激活时遇Legacy autograd弃用错误,求解决方案
解决CFNet加载Mish激活函数时的RuntimeError问题
问题根源
你使用的Mish激活函数实现基于旧版PyTorch的torch.autograd.Function写法,未将forward方法定义为静态方法,不符合新版PyTorch的要求,因此触发弃用错误。
解决方案
有两种可行的修改方式,任选其一即可:
方式一:修正自定义autograd Function的写法
找到项目中Mish激活函数的实现代码,将forward和backward方法改为静态方法,并用ctx替代原代码中的self来处理张量保存与读取:
旧版错误写法示例:
class MishFunction(torch.autograd.Function): def forward(self, x): self.save_for_backward(x) return x * torch.tanh(F.softplus(x)) def backward(self, grad_output): x = self.saved_tensors[0] sx = torch.sigmoid(x) fx = F.softplus(x).tanh() return grad_output * (fx + x * sx * (1 - fx * fx))
修改后的正确写法:
import torch import torch.nn.functional as F import torch.nn as nn class MishFunction(torch.autograd.Function): @staticmethod def forward(ctx, x): ctx.save_for_backward(x) return x * torch.tanh(F.softplus(x)) @staticmethod def backward(ctx, grad_output): x, = ctx.saved_tensors sx = torch.sigmoid(x) fx = F.softplus(x).tanh() return grad_output * (fx + x * sx * (1 - fx * fx)) class Mish(nn.Module): def forward(self, x): return MishFunction.apply(x)
方式二:简化Mish实现(推荐)
新版PyTorch支持自动求导,无需手动定义torch.autograd.Function,直接用纯张量运算实现Mish,代码更简洁且无版本兼容问题:
import torch import torch.nn.functional as F import torch.nn as nn class Mish(nn.Module): def forward(self, x): return x * torch.tanh(F.softplus(x))
验证修改
替换项目中的Mish激活函数实现后,重新启动CFNet训练,即可消除该RuntimeError。
内容的提问来源于stack exchange,提问作者HamedRK89
相关产品推荐
相关产品推荐

