pytorch 错误解决:NotImplemented Error

文章目录

  • 错误描述
  • 问题分析
  • 特殊情况

错误描述

File “”, line 1, in
runfile(‘C:/usr/local/Anaconda3/mylib/Autoencoder_test.py’, wdir=‘C:/usr/local/Anaconda3/mylib’)

File “C:\usr\local\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py”, line 705, in runfile
execfile(filename, namespace)

File “C:\usr\local\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py”, line 102, in execfile
exec(compile(f.read(), filename,exec), namespace)

File “C:/usr/local/Anaconda3/mylib/Autoencoder_test.py”, line 85, in
xhat = model(x)

File “C:\usr\local\Anaconda3\lib\site-packages\torch\nn\modules\module.py”, line 477, in call
result = self.forward(*input, **kwargs)

File “C:\usr\local\Anaconda3\lib\site-packages\torch\nn\modules\module.py”, line 83, in forward
raise NotImplementedError

NotImplementedError

问题分析

  • 通常这种情况下的问题有:
    • 定义自己的 Module 的时候 forward 函数没有实现 / forward 函数名字写错了 / forward 函数前后位置的缩进有空格或者缩进错误
    • 使用了 ModuleList 去存放自己的网络模块。但是没有在 forward 中将 ModuleList 中的模块进行连接

特殊情况

  • 还有一种非常容易疏忽的情况:

    • 在调用别人的预训练模型或者别人封装好的模块的时候,里面包含了 ModuleList 模块,但是你没有对齐中的内容进行连接。比如下面这种情况。
    • 目前我想要使用别人写好的 A 模型作为我的网络的一部分,但是 A 模型自身包含两部分,第一部分是 Sequential 定义好的模块(这个模块不需要我们重新通过 forward 进行连接),第二部分是 ModuleList
    • 那么当我们构建我们自己网络的时候,无论这个 ModuleList 藏得有多深,如果我们不在自己的 forward 函数中进行人为的连接,他都会报错 NotImplemented Error
    • 所以我用下面的代码将 A模型 中的部分进行遍历,如果遇到上述 ModuleList 的情况,就把他们加入到 Sequential 结构中
    def model2extractor(model):
        sequential = nn.Sequential()
        for name, module in model.named_children():
            print(name)
            if isinstance(module, nn.ModuleList):
                mod = nn.Sequential(*module)
                sequential.add_module(name, mod)
            else:
                sequential.add_module(name, module)
        return sequential
    

你可能感兴趣的:(Pytorch学习,pytorch,python,深度学习)