① ReLU 활성화 함수에서 inplace 의미에 대해 대략 살펴보았습니다. inplace 연산이란 연산에 대한 결괏값을 새로운 변수에 저장하는 것이 아닌 기존 데이터를 대체하는 것을 의미합니다. 즉, 기존 값을 연산 결괏값으로 대체함으로써 기존 값들을 무시하겠다는 의미입니다.
② nn.AdaptiveAvgPool2d는 nn.AvgPool2d처럼 풀링을 위해 사용합니다. AvgPool2d에서는 풀링에 대한 커널 및 스트라이드 크기를 정의해야 동작합니다. 예를 들어 nn.AvgPool2d((3, 2), stride=(2, 1))처럼 지정하면 그 결과는 5×5 텐서를 3×3 텐서로, 7×7 텐서를 4×4 텐서로 줄이는 효과를 얻을 수 있습니다. 조금 더 정확히 표현하자면, (N, C, Hin, Win) 크기의 입력을 (N, C, Hout, Wout) 크기로 출력하는 것이 AvgPool2d입니다. 이때 Hout, Wout은 다음과 같은 공식에 의해 계산됩니다.
반면에 AdaptiveAvgPool2d는 풀링 작업이 끝날 때 필요한 출력 크기를 정의합니다. 즉, nn.AvgPool2d에서는 커널 크기, 스트라이드, 패딩을 지정했다면 nn.AdaptiveAvgPool2d는 출력에 대한 크기만 지정합니다. 앞의 수식에서 Hout, Wout 값이 정해졌기 때문에 커널 크기, 스트라이드, 패딩 값을 구할 수 있습니다. 따라서 AdaptiveAvgPool2d를 사용할 경우 출력 크기에 대한 조정이 상당히 쉬워집니다. 참고로 AdaptiveAvgPool2d는 입력 크기에 변동이 있고 CNN 위쪽에 완전연결층을 사용하는 경우 유용합니다.