최근 python으로 최적화 코드를 짜던 와중 발견한 오류다. pytorch의 nn.Parameter를 이용해서 짜거나 CVPR2023에 공개된 pypose (https://github.com/pypose/pypose) 의 pp.Parameter를 이용해서 짤 때 발견된다. 참고로 pypose는 pytorch와 호환되도록 짜여져있어서 똑같은 에러가 발생했다.
오류명에서도 알 수 있다시피 pytorch optimizer나 pypose optimizer 모두 optimzier 에게 최적화 대상이 되는 Neural network model 혹은 Error model의 파라미터를 넘겨주어야 하는데 이게 없다는 소리다.
즉, optmizer(model)로 초기화를 할 때 model.parameters()가 호출되는데 이 return 값이 None이라 발생한다.
실제로 model에 파라미터를 설정해주지 않았을 수도 있지만 Neural network를 쓰면 자동으로 해주니 그럴 일이 극히 드물고 별도로 구현하더라도 이걸 까먹기는 힘들다.
내가 겪은 문제 상황은 실제로 model 안에 nn.Parameter 혹은 pp.Parameter가 있음에도 return이 None으로 돌아오는 것이었다.
원인
pytorch에서 nn.Module을 상속받아 만든 객체들은 model.parameters()를 호출하면 내부에 들어있는 nn.Parameter를 찾기 시작하는데 이 파라미터들이 list 안에 들어있으면 못 찾는다!
import torch.nn as nn
import pypose as pp
params = [nn.Parameter1, nn.Parameter2, ...] # cannot find
params = [pp.Parameter1, pp.Parameter2, ...] # cannot find
해결법
import torch.nn as nn
params = nn.ParameterList(params)
다행히 wrapping해주는 클래스가 따로 있다. 이걸로 감싸줘야 한다.
list 안에 list 형태가 있을 수 있는데 그건 다시 구현하는게 낫다.