错误描述
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
中的模块进行连接
- 定义自己的 Module 的时候
特殊情况
-
还有一种非常容易疏忽的情况:
- 在调用别人的预训练模型或者别人封装好的模块的时候,里面包含了 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