pytorch 튜토리얼 따라하다가 궁금한 점이 있어서 질문 드립니다.

위의 이미지에서 28X28 이미지가 14X14 로 줄어드는 과정과 10X10 이미지가 5X5로 줄어들기
위해서는 맥스풀 또는 에버리지풀이 있어야 하는것으로 이해하고 있습니다.

그래서 관련된 소스를 살펴보면,

Net Class가 구현되어 있는 것을 보고 있는데요.
빨간색으로 표시된 1,2에 맥스풀이 실행되어야 하는게 아닌가… 라는 생각이 듭니다.

어떤 부분을 제가 잘못 이해하고 있는 것인지요?

선배님들의 많은 조언 부탁드립니다.

2개의 좋아요

안녕하세요, 머신러닝 공부하시고자 하는 열정이 대단하시군요.
질문 주신 코드 부분을 봤는데, 해당 부분은 클래스의 프로퍼티 선언하는 부분입니다.
클래스 변수라고도 부를 수 있는데, 생성자에서 저렇게 선언을 해 두면
클래스 메소드에서 self.xxx 라는 방식으로 해당 프로퍼티(변수)를 사용할 수 있게 됩니다.

파이썬에서는 변수에 함수 할당도 가능하기 때문에,
클래스 프로퍼티 conv에 nn.Conv2d(1, 6, 5)를 선언해 두면 클래스 내부에서 nn.Conv2d(1, 6, 5)를
필요로 할 때마다 매 번 동일한 숫자를 쓸 필요 없이 self.conv1(something_input) 이런 식으로 사용 가능합니다.
클래스 내부에서 계속 사용해줘야 되는 변수나 함수 호출인 경우 이렇게 클래스 프로퍼티로 설정해 두면
오타나 실수 없이 해당 프로퍼티를 사용할 수 있어 실수를 줄여주고 가독성을 높이기도 하죠.
그래서 해당 부분은 직접적으로 입력을 받아서 바로 컨볼루션을 시행하는 부분이 아니라,
레이어의 입출력 채널 및 컨볼루션 행렬을 정의하는 부분이라고 생각하시면 됩니다.

말씀하신 max pooling은 아래 forward() 메소드 내부에서 이루어지고 있는데 코드를 한번 살펴볼까요.
x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
이 부분의 self.conv1(x)가 x값을 입력으로 받고
입력 채널 1개, 출력 채널 6개, 5x5 정사각 컨볼루션을 수행하는 부분입니다.
풀어서 쓰자면
x = F.max_pool2d(F.relu(nn.Conv2d(1, 6, 5)(x)), (2, 2))
라고도 할 수 있겠군요.

1급 객체([Python] 변수에 함수 저장)라는 개념까지 이해를 하면 굉장히 쉬운 부분이지만
처음 이런 식의 코드를 보면 생소하실 수도 있는 것이 사실입니다.
자주 쓰이는 레이어나 기능은 변수로 선언해 두고, 필요할 때 통일된 변수로 해당 기능을 가져온다,
정도로만 이해해 두시면 나중에 다른 코드 보실 때에도 이해하기 쉬우실 것 같습니다.

2개의 좋아요

답변 감사합니다.

클래스내에서 생성자 함수부분의 선언만 보고 성급하게 생각했었네요.
forward 함수 내부에서 실행되는 과정을 보니 내용이 이해되었습니다. ^^

상세한 설명 감사합니다.

2개의 좋아요