인프런 커뮤니티 질문&답변
추가 질문
작성
·
1.3K
0
첫번째로 알려주신 내용으로 저번 질문에 층 추가를 해봤습니다.
답변 1
0
패딩 없이 conv와 maxpool을 반복적으로 사용했기 때문에 층을 거쳐갈 때마다 피쳐 사이즈가 줄어듭니다. 그런데 층을 과도하게 늘렸기 때문에 피쳐맵 사이즈가 3x3커널보다 작게 되어 작동을 안하게 된겁니다. 이미지가 작은데 층을 깊게 쌓고 싶다면 크게 두가지 방법이 있습니다.
1. 이미지 사이즈 늘리기
전처리에서 이미지 사이즈를 늘려주면 됩니다.
2. 패딩 사용하기
conv를 사용할 때 3x3필터에 stride=1일 경우 패딩 1장(padding=1)을 사용하면 사이즈가 줄어들지 않습니다.
예) nn.Conv2d(16, 32, 3, stride=1, padding=1)
3. 1x1 conv 사용하기
conv를 사용할 때 1x1필터에 stride=1일 경우 입력 크기와 출력 크기가 변하지 않습니다.
마지막으로 self.pool4에서 출력한 피쳐맵의 크기를 계산해서 64*3*3 부분들을 수정해주시면 됩니다.
이론편 참고하시면 패딩 설명하는 부분에서 이 현상을 말했을 겁니다!
CIFAR10 사용 하셨다면 이미지 크기가 32이니까 피쳐맵의 크기가 conv1 지나면 (32-5)/1 + 1 =28 이 되고 pool1을 지나면 (28-2)/2 + 1 = 8이 되고 그 다음 conv2의 출력 피쳐맵의 크기는 (8-5)/1 + 1 = 4이고 이런 식으로 될 겁니다.
위에서 설명한 것을 forward 함수 내에 x 사이사이에 print(x.size()) 다 넣어서 크기를 확인해 보실 수 있습니다. 그러면 x의 크기가 어떤식으로 변하는지 볼 수 있는데 에러 나오는 바로 전 크기 확인해 보시면 필터 사이즈보다 x 사이즈가 작을겁니다.
어떻게 수정해야 할 지는 답이 없습니다. 사용자가 선택해야 합니다.
이미지 사이즈 늘리고 싶으면 전처리 부분에서 transform.Resize(128) 이런 식으로 늘리면 되고
패딩을 주고 싶으면 nn.Conv2d 에 padding=1 이나 2 넣으시면 됩니다. 아니면 5x5 필터 사용한 것은 3x3이나 1x1로 바꿔주시면 피쳐맵 크기가 덜 작아지거나 유지 됩니다. 아니면 층 자체를 몇 개 빼셔도 되요.
말씀해 주신 부분을 제가 코딩을 해 버리면 수강자 분께 도움이 안됩니다..ㅠㅠ 일단 x 사이즈 print하시고 이 것 저 것 바꿨을 때 x 사이즈가 어떻게 되는지 감을 익혀 보세요!
상세한 답변 감사합니다.
제가 아래 공식을 모르고 있었네요.
다시 한번 해보겠습니다. 감사합니다.
Output Size = (W - F + 2P) / S + 1
W: input_volume_size
F: kernel_size
P: padding_size
S: strides
nn.Conv2d(3, 32, 3, padding=1)





상세한 답변감사합니다.
하지만 파이썬 코딩에 익숙하지 못해서 그런지,
동영상을 수십번 돌려봐도 어딜 어떻게 수정해야할지 잘 안되네요...
설명으로 어떤 부분이 오류인지는 알겠으나, 소스를 어떻게 수정해야할지는 막막하네요.
혹시 좀더 가이드 부탁드려도 될까요..