Pytorch版本过高产生的RuntimeError: Legacy autograd function with non-static forward method is deprecated.

前言

在尝试用ECO Lite做视频分类的时候,使用了作者的Pytorch实现,然而Pytorch实现是基于Pytorch0.4的,我自己的Pytorch版本是1.4,所以在跑模型的时候出现了一些问题,这里记录一下。

问题

  1. 第一个问题就是前向传播的静态方法,报错如下:

RuntimeError: Legacy autograd function with non-static forward method is deprecated. Please use new-style autograd function with static forward method

解决

  1. 第一个问题的解决方法如下:
    – 官方给出的simple是使用@staticmethod装饰器,将forward变为静态方法,但是这样无法使用类和实例的变量,这怎么行呢,没有对象的人不能放弃面向对象,所以放弃。
    – 第二个方法是从SSD网络的bug借鉴过来的,目标检测的SSD pytorch实现也是有同样的问题,但是我不知道什么原理,解决措施如下:

  • 首先,找到报错位置,我这里是在models.py最后加入代码测试的,加入的代码如下:
if __name__ == "__main__":
   from torchsummary import summary
   import time 

   model = TSN(2,12,'scratch','RGB',base_model='ECO',consensus_type='identity', dropout=0.4, partial_bn=not True)
   x = torch.rand([12,3,224,224])
   t1 = time.time()
   with torch.no_grad():
       for i in range(100):
           x = torch.rand([12,3,224,224])
           result = model.forward(x)
       t2 = time.time()
       t = (t2-t1)/100
       print(result,'cost time:',t)
   #summary(model,input_size=(12,3,224,224),batch_size=1)
  • 报错发生在前向传播里的:
    base_out = self.base_model(input_var)
    需要改成:
    base_out = self.base_model.forward(input_var)
    修改这一个地方还不够,运行仍然会报错的,顺着报错信息把所有的模型前向传播都加上forward就能解决问题。比如在basic_ops.py里的:
def forward(self, input):
       return SegmentConsensus(self.consensus_type, self.dim).forward(input)

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值