Search

nn.Module의 modules()와 children()

nn.Module 클래스를 상속받아 만든 모델 클래스의 인스턴스는 modules()메소드와 children() 메소드로 하위 모듈(레이어)들을 불러올 수 있다. (e.g. nn.Conv2d, nn.Upsample 등등)
두 메소드의 차이는 무엇일까?
일단 예시로 Test라는 클래스를 구성하고 model이라는 변수로 인스턴스를 할당해 주겠다.
import torch import torch.nn as nn class Test(nn.Module): def __init__(self) : super().__init__() self.conv1 = nn.Conv2d(3, 128, 3) self.conv2 = nn.Sequential(nn.Conv2d(128, 64, 3), nn.Conv2d(64, 128, 1)) self.conv3 = nn.Upsample(scale_factor=2) def forward(self, x): output = self.conv1(x) output = self.conv2(x) output = self.conv3(x) model = Test()
Python
복사

self.modules()

self.modules는 nn.modules에 속하는 모듈들을 반환한다.
modules = list(model.moduels()) for m in modules: print(m) print('0-0-0-0-0')
Python
복사
결과
마치 깊이우선탐색을 하듯 상위부터 가장 하위에 있는 모듈까지를 모두 반환한다.
자기자신인 Test객체부터 그 하위의 Conv2d, Sequential, Sequential 하위의 nn.Conv2d 모듈들까지 밑의 그림과 같은 순서대로 반환한다.

nn.children()

self.children()은 모델 클래스의 멤버 변수로 정의된 submodules만을 반환합니다.
print(list(model.children()))
Python
복사
보이듯이 self.conv1, self.conv2, self.conv3 세가지만 반환한 것이 보이네요