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()
self.modules는 nn.modules에 속하는 모듈들을 반환한다.
modules = list(model.moduels())
for m in modules:
print(m)
print('0-0-0-0-0')
결과

마치 깊이우선탐색을 하듯 상위부터 가장 하위에 있는 모듈까지를 모두 반환한다.
자기자신인 Test객체부터 그 하위의 Conv2d, Sequential, Sequential 하위의 nn.Conv2d 모듈들까지 밑의 그림과 같은 순서대로 반환한다.

self.children()은 모델 클래스의 멤버 변수로 정의된 submodules만을 반환합니다.
print(list(model.children()))

보이듯이 self.conv1, self.conv2, self.conv3 세가지만 반환한 것이 보이네요