파이토치에서 리스트와 반복문으로 인공 신경망 레이어 정의하는 방법
설명
쌓아야할 층이 많거나, 신경망 구조를 자주 바꿔야하는 등의 이유로 인공 신경망의 정의를 자동화하고 싶은 경우가 있다. 이럴 때 다음과 같은 for문으로 정의하고 싶은 생각이 들 것이다.
class Model(nn.Module):
def __init__(self):
super(Model, self).__init__()
fc_ = [nn.Linear(n,n) for i in range(m)]
def forward(self, x):
for i in range(m):
x = fc_[m](x)
x = F.relu(x)
return x
하지만 이와 같이 파이썬 리스트로 신경망을 정의하게되면 각 nn.Linear
층의 파라매터를 인식하지 못한다. 따라서 파라매터가 옵티마이저로 제대로 전달되지 않고, 옵티마이저를 정의할 때 다음과 같은 에러가 발생한다.
ValueError: optimizer got an empty parameter list
따라서 레이어들의 리스트를 이용하여 신경망을 구성하고 싶으면, nn.ModuleList()
를 통해 __init__()
에서 인스턴트 속성(self.
)으로 정의해야 한다. 이렇게 정의해놓으면 일반적인 리스트처럼 인덱싱, 슬라이싱, 더하기 등이 가능해진다.
다음은 신경망의 각 레이어와 forward를 리스트를 이용해 정의하고, 가중치를 초기화하는 코드이다.
코드1
class fx_Net(nn.Module):
def __init__(self):
super(fx_Net, self).__init__()
fc_ = [nn.Linear(n,n) for i in range(m)]
self.linears = nn.ModuleList(fc_)
for m in self.linears:
torch.nn.init.zeros_(m.weight.data)
def forward(self, x):
for i in range(m):
x = self.linears[m](x)
x = F.relu(x)
return f
환경
- OS: Windows10
- Version: Python 3.9.2, torch 1.8.1+cu111