logo

파이토치에서 리스트와 반복문으로 인공 신경망 레이어 정의하는 방법 📂머신러닝

파이토치에서 리스트와 반복문으로 인공 신경망 레이어 정의하는 방법

설명

쌓아야할 층이 많거나, 신경망 구조를 자주 바꿔야하는 등의 이유로 인공 신경망의 정의를 자동화하고 싶은 경우가 있다. 이럴 때 다음과 같은 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