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

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

설명

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

환경


  1. https://pytorch.org/docs/stable/generated/torch.nn.ModuleList.html ↩︎

댓글