Search

nn.ModuleList vs list

nn.ModuleList는 여러개의 구성요소를 하나의 리스트로 담는 역할을 하는데, 일반 list와의 차이가 뭔지 궁금했다
modules = [] for rate in atrous_rates: modules += [ASPPConv(in_channels, in_channels//2, rate, 3, nn.ReLU())] self.convlist = nn.ModuleList(modules)
Python
복사
nn.ModuleList 는 파이썬 list의 속성을 가지고 있어 forward 메소드 정의에서도 큰 차이가 없다
def forward(self, x): conv_results = [] for conv in self.convlist: conv_results += [conv(x)] output = torch.cat(conv_results, dim=1) output = self.project(output) return output
Python
복사
차이가 나는 부분은 이렇게 확인할 수 있다
class WAB(nn.Module): def __init__(self, in_channels, out_channels, atrous_rates:List[int]): super(WAB, self).__init__() modules = [] for rate in atrous_rates: modules += [ASPPConv(in_channels, in_channels//2, rate, 3, nn.ReLU())] self.convmodulelist = nn.ModuleList(modules) self.convlist = modules self.project = nn.Sequential( nn.Conv2d(len(self.convlist) * (in_channels//2), out_channels, 1, bias=False), nn.BatchNorm2d(out_channels), nn.ReLU(), ) # 원래 WAB는 project에서는 그냥 conv만 있음 def forward(self, x): conv_results = [] for conv in self.convlist: conv_results += [conv(x)] output = torch.cat(conv_results, dim=1) output = self.project(output) return output
Python
복사
self.convmodulelist는 ModuleList로 구성된 네트워크이고
self.convlist는 리스트로 구성된 네트워크이다
if __name__ == '__main__': Network = WAB(256, 256, [1, 2, 3, 4]) for name, param in Network.named_parameters(): print(f"param name: {name} , shape: {param.shape}")
Python
복사
이렇게 확인해보면
convlist에 대한 내용은 보이지 않는다
즉, optimizer 호출시 model.parameters()로 모델의 파라미터를 전달하는데, 일반 list로 구성된 파라미터들이라면 전달되지 않을 것이기 때문에 훈련되지 않고, state_dict()로 저장시에도 일반 파이썬 리스트로 구성된 모듈들은 저장되지 않는다