Conv2d, ConvTranspose2d의 사이즈 이슈

안녕하세요.

현재 이미지를 데이터셋으로 사용하는 딥러닝 모델을 짜고 있습니다.

훈련 시 다양한 사이즈의 데이터에 대해 효과적으로 학습하기 위해 훈련 데이터로 다양한 사이즈 그룹을 사용합니다.

이 때,
nn.Conv2d(in_channels, out_channels, kernel_size=5, stride=2, padding=2)
인 2d convolutional layer를 통과하고 그 후

nn.ConvTranspose2d(in_channels, out_channels, 5, stride=2, padding=2)
인 2d deconvolution layer를 통과합니다.

인채널, 아웃채널은 이 질문에선 중요한게 아니라서 저 상태로 뒀습니다

그런데 처음 들어오는 인풋의 width 및 height가 홀수일 때와 짝수일 때 그 최종 shape이 다르게 나와서 이를 어떻게 해결할지 고민입니다.

예를 들어 인풋의 사이즈가 [2, 3, 160, 160] 일 때, [2, 3, 159, 159] 일 때, [2, 3, 159, 160] 일 때 저 layer들을 통과하면 공통적으로 [2, 3, 159, 159] 인 크기의 아웃풋을 출력합니다. ConvTranspose2d에 output_padding을 다르게 적용하면 같게 할 순 있지만, 하나의 ConvTranspose2d를 이용해서 모든 사이즈를 통과시켜야하므로 적절하지 않은 방법이라 생각됩니다.

인풋과 아웃풋 사이의 추가적인 연산이 필요하여 크기를 맞춰야하는 상황인데, 말씀 드린 것과 같이 크기가 다른 문제가 발생하여 진행을 못하고 있습니다.

어떤 식으로 적용해야 모든 경우에 대해서 인풋과 아웃풋의 크기를 동일하게 맞출 수 있을까요?

Conv layer 입력 크기가 달라지면 출력 크기도 그에 따라 달라질 수 밖에 없습니다.

https://pytorch.org/docs/stable/generated/torch.nn.Conv2d.html
여기 링크를 보시면 Conv2d 의 Input 에 따라서 Output Shape를 결정하는 공식이 있습니다.

그래서 동일한 출력 결과를 얻고 싶으시면 입력의 크기를 무엇이 들어오든 하나로 통일하는 것이 필요해 보입니다.
위 예제에서는 입력 H,W를 160x160 로 리사이즈 하시도록 추가해 보시면 어떨까 합니다. (입력이 159x160, 159x159, 160x160이 들어오든 160x160으로 처리하도록…)

제가 생각한 방법은 이런데 혹시 더 좋은 아이디어 있으시면 공유 해주세요.
감사합니다.

3개의 좋아요

출력값을 고정하는 목적이라면 adaptive 계열의 pooling 레이어를 추가하는 것도 고려해볼 수 있을 것 같습니다. (adaptiveAvgPooling, adaptiveMaxPooling…)

1개의 좋아요