padding, stride, pooling
패딩(padding)
선생님, Padding은 뭔가요? 밸리드 패딩 / 풀 패딩 / 세임 패딩
패딩(padding)의 사용은 앞에서 언급했듯이 출력 크기를 보정하기 위해 사용하며 ‘충전재’라는 의미처럼 입력 데이터의 사방을 특정 값으로 채우는 것을 말한다. 일반적으로 특정 값은 그냥 0을
ardino.tistory.com
합성곱 연산 전에 입력 데이터 주변에 특정 값을 채우는 것을 의미한다.
- 밸리드 패딩 (valid padding)
패딩을 하지 않은 상태. 필터를 통과시키면 항상 입력 사이즈보다 작아진다
밸리드 패딩을 사용하면 합성곱 연산시에 모든 원소가 같은 비율로 들어가지 않는 문제가 생긴다.
위의 그림과 같이 합성곱 연산시에 그림의 가운데 부분은 여러번 사용되지만, 끝부분과 모서리부분은 연산에 덜 참여하게 된다.
-풀 패딩(full padding)
밸리드 패딩의 문제점을 개선하여 입력 데이터의 모든 원소가 합성곱 연산에 같은 비율로 참여하도록 하는 패딩 방식을 말한다. 풀 패딩의 폭은 언제나 (필터의 크기 -1)이다.
필터 크기가 3*3 일 경우 풀 패딩은 padding = (3-1) = 2 와 같다.
풀 패딩을 적용해주었을 경우, 모든 원소가 9번씩 합성곱 연산에 사용되는 것을 볼 수 있으며, 연산 후 데이터의 크기는 (원래 데이터의 크기 + 패딩의 폭)이 된다.
- 세임 패딩(same padding)
출력 크기를 입력 크기와 동일하게 유지하는 패딩을 의미하며 동일하게 유지하기 위해선 패딩의 폭이 (필터의 크기 -1 /2)이다. 풀 패딩의 폭에 1/2를 한 것과 같으므로 하프 패딩이라고도 불린다.
-PyTorch padding
conv = nn.Conv1d(1, 1, 3, padding=4, padding_mode='zeros', bias=False)
파이토치에는 Conv layer에서 패딩과 패딩모드를 정해줄 수 있다.
padding은 int, tuple, str의 값을 넣어줄 수 있으며 str의 경우 'same'과 'valid'로 same, valid 패딩을 구현할 수 있다.
padding mode는 {"zeros","reflect","replicate","circular"}값이 들어갈 수 있다.
- zeros: zero-filling을 이용한다.
- reflect: 양 끝에 거울처럼 반사된 값을 사용한다. 단, 이 경우 input 크기보다 더 큰 값의 padding을 사용할 수 없다.
- replicate: 양 끝단의 값을 padding 값으로 이용한다.
- circular: input 값을 순환하여 사용한다.
x = torch.tensor([[[1, 2, 3, 4, 5]]]).float()
conv.weight = torch.nn.Parameter(torch.tensor([[[0., 1., 0.]]]))
conv = nn.Conv1d(1, 1, 3, padding=4, padding_mode='zeros', bias=False) # zeros
>> tensor([[[0., 0., 0., 1., 2., 3., 4., 5., 0., 0., 0.]]])
conv = nn.Conv1d(1, 1, 3, padding=4, padding_mode='reflect', bias=False) # reflect
>> tensor([[[4., 3., 2., 1., 2., 3., 4., 5., 4., 3., 2.]]])
conv = nn.Conv1d(1, 1, 3, padding=4, padding_mode='replicate', bias=False) # replicate
>> tensor([[[1., 1., 1., 1., 2., 3., 4., 5., 5., 5., 5.]]])
conv = nn.Conv1d(1, 1, 3, padding=4, padding_mode='circular', bias=False) # circular
>> tensor([[[3., 4., 5., 1., 2., 3., 4., 5., 1., 2., 3.]]])
Stride와 Pooling
CNN에서 feature의 resolution을 1/2로 줄일 때, stride = 2와 max/avg pooling 모두를 사용할 수 있다.
convolution with stride의 장단점
- 학습 가능한 파라미터가 추가되므로 네트워크가 resolution을 잘 줄이는 방법을 학습 할 수 있어서 pooling보다 성능이 좋다
- feature를 뽑기위한 Conv layer와 Downsampling을 위한 stride를 동시에 적용할 수 있어서, 같은 필터가 더 넓은 receptive field를 보는 효과를 낼 수 있다.
- 다만 pooling 방식에 비해 연산량이 늘어나고 파라미터의 수가 증가하게 된다
pooling 의 장단점
- Conv with stride 대비 연산량이 적고, 파라미터의 숫자가 줄어드므로 학습시간을 줄일 수 있다
- layer를 줄여서 gradient 전파에 초점을 두는 경우, conv를 통해 줄이기보다는 pooling을 사용하는 것이 효과적이다.
Adaptive Pooling
입력에 관계없이 출력을 고정된 크기로 뽑아내주는 pooling 방식
이미지 분류 문제에서 입력 값의 크기에 상관없이 fc layer에 넣어줄 고정된 값을 뽑아내기 위해 사용된다
>>> a = torch.randn(1, 2, 5, 5) # (1,2,5,5) 차원의 데이터를
>>> c = F.adaptive_max_pool2d(a, (4, 4)) # adaptive pooling을 사용해서 ( , ,4,4)로 고정했다
>>> c.size()
torch.Size(1, 2, 4, 4)
>>> b = torch.randn(7,8,9,10) # (7,8,9,10) 차원의 데이터를
>>> c = F.adaptive_max_pool2d(a, (4, 4)) # adaptive pooling을 사용해서 ( , ,4,4)로 고정했다
>>> c.size()
torch.Size(7, 8, 4, 4) # 입력 값의 차원에 상관없이 고정된 차원의 데이터로 만들어준다