본문 바로가기
  • 기술을 이야기하지만 사람을 생각합니다.
20. Deep Learning

[PyTorch로 시작하는 딥러닝 기초] Lab-10-1 Convolution

by WE DONE IT 2020. 3. 7.

edwith의 부스트코스 강의 Part 3 - CNN <Lab-10-1 Convolution>를 정리한 글입니다. 잘못된 부분이 있으면 말씀해 주세요!

 

[LECTURE] Lab-10-1 Convolution : edwith

학습목표 합성곱 (Convolution) 연산에 대해 알아본다. 핵심키워드 합성곱 (Convolution) 연산 필터(Filter) 스트라이드(Stride) 패딩(Padding) ... - tkddyd

www.edwith.org


Convolution

이미지 위에 stride 값 만큼 filter(kernel)을 이동시키면서 겹쳐지는 부분의 각 원소의 값을 모두 곱한 뒤 더한 값을 출력하는 연산

Convolution 개념: Input에 filter 값을 convolution하면 output이 나오게 된다.
Convolution을 계산하는 방법

Stride and Padding

  • stride: filter를 한 번에 이동하는 간격
  • padding: input의 크기 만큼 이미지의 상하좌우에 '0'으로 된 pad가 둘러지게 됨
    • zero-padding: 이미지 상하좌우에 둘러진 '0' 값이 없음

Padding의 개념

 


Pytorch nn.Conv2d


torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation 1, groups=1, bias=True)

(dilation과 groups에 대한 내용은 많이 다루지 않으므로 생략함)


  • in_channels = 1
  • out_channels = 1
  • kernel_size = 3 (경우에 따라서는 3, 1 등으로 사이즈를 바꿀 수 있음) 

 

입력의 형태

  • input type: torch.Tensor (Tensor 형태로 되어 있어야 함)
  • input shape : (N x C x H x W) -> batch_size, channel, height, width  

Convolution의 output 크기

Output size 구하는 공식

예제 1) 

  1. 227 - 11 + (2 * 0) = 226
  2. 226 / 4 = 54
  3. 54 + 1 = 55

예제 2) 소수점이 있는 경우, 소수점을 버림

  1. 64 - 7 + (2 * 0 ) / 2 = 28.5 
  2. 28 + 1 = 29

예제 3)

  1. 32 - 5 + (2 * 2) / 1 = (27 + 4 ) / 1 = 31
  2. 31 + 1 = 32

예제 4) Input size가 다른 경우

  1. (32, 64) - 5 + (2 * 0)  / 1 = ((32-5, 64-5 / 1 )
  2. ((27, 59) / 1 ) + 1 = 28 * 60 
  3. out.shape >> torch.Size([1, 1, 28, 60])

예제 5)

  1. 64 * 32
  2. out.shape >> torch.Size([1, 1, 64, 32])

 

output size를 터미널에서 확인하는 경우 (예제 1)


import torch
import torch.nn as nn
conv = nn.Conv2d(1, 1, 11, stride=4, padding=0)
conv
>> Conv2d(1, 1, kernel_size(11, 11), stride = (4, 4))


Neuron과 Convolution의 관계

Perceptron의 weight 값으로 filter가 들어가게 된다. input값 중 첫 번째에 해당하는것과 weight가 곱해지게 된다. Perceptron을 거쳐 값은 8이 된다.Filter 역시 bias를 가질 수 있으며, 실제 출력값은 8 + bias가 된다.

Pooling

(1) 이미지의 크기를 줄이거나 (2) fully connected 연산을 대체하기 위해 average pooling을 사용하기도 한다.

 Max Pooling과 Average Pooling의 개념

CNN Implementation


import torch
import torch.nn as nn
import = torch.Tensor(1, 1, 28, 28)
conv1 = nn.Conv2(1, 5, 5)
pool = nn.MaxPool2d(2)
out = conv1(input)
out2 = pool(out)
out2.size()
>> torch.Size([1, 5, 12, 12])



Cross-correlation

Convolution은 뒤집고 계산하며, Cross-correlation으로 적힌 이유는 filter를 뒤집지 않고 계산한다.

Convolution과 Cross-correlation의 차이 (중요한 개념은 아니며, 참고용으로 추가 설명함)

댓글2

  • ㅇㅇㅇ 2021.04.13 17:55

    padding 정의 : padding의 크기 아니고 input의 크기 (오타)

    =========== 수정 필요
    import torch
    import torch.nn as nn
    input = torch.Tensor(1, 1, 28, 28)
    conv1 = nn.Conv2d(1, 5, 5)
    pool = nn.MaxPool2d(2)
    out = conv1(input)
    out2 = pool(out)
    out2.size()

    =========== 수정 필요

    잘 읽었습니다! 감사합니다

    답글