파이토치로 시작하는 딥러닝 기초 - Part3.CNN


  • Convolution Neural Network에 대한 소개
    • Convolution
    • MNIST
    • Pytorch Visdom
    • Pytorch Datasets & Custom Datasets
    • CIFAR-10
    • VGG & ResNet

PART 3: CNN

Lab10-1 Convolution

  • Convolution
    이미지 위에서 Stride값 만큼 Filter(Kernel)을 이동시키면서 겹쳐지는 부분의 각 원소의 값을 곱해서 모두 더한 값을 출력하는 연산
  • Stride
    Filter를 한 번에 얼마나 이동할 것인가.
  • Padding
    Zero-Padding 생각! (Input이미지 주변을 0으로 둘러쌈)
  • PyTorch 상의 2D Convolution 생성하기!
    • torch.nn.Conv2d

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

      pytorch03-01

      • 경우에 따라서는 3x3처럼 정사각형 모양의 Filter가 아니라, (3,1)과 같은 형태로 선언하는 그런 경우도 있음.
      • 이럴 때는 kernel_sze 부분에 (3,1)와 같이 괄호를 쳐서 표기하면 됨
  • nn.Conv2d(1,1,3)을 만들었다고 가정
    • Input Type: torch.Tensor 타입이어야 한다.
    • Input Shape: (N x C x H x W) 형태여야 함
      (batch_size, channel, height, width)

    • Output의 크기는?
      다음과 같은 마법의 공식(?) 존재 (와웅 신기하다~~~ 짱짱맨)
      pytorch03-02
      • 첫 번째 예제를 진행해보면
        pytorch03-03
        (짱 신기함…)
  • Neuron과 Perceptron의 관계?
    pytorch03-04

  • 하지만 Filter 또한 Bias를 가질 수 있기 때문에 실제 출력은 다음과 같이 이루어진다.
    pytorch03-05

  • Pooling
    • 이미지의 사이즈를 줄이기 위해

    • Cf) Fully Connected 연산을 대체하기 위해 Average Pooling을 사용하는 경우도 존재

    • torch.nn.MaxPool2d

      torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)

      • kernel_size만 잘 설정해주면 되는 편 (나머지는 다 default 값이 있기 때문에)
  • ex)

    import torch
    import torch.nn as nn
      
    inputs = torch.Tensor(1,1,28,28)
    conv1 = nn.Conv2d(1, 5, 5)  
    pool = nn.MaxPool2d(2)
    out = conv1(inputs)  
    out2 = pool(out)
      
    #out.size()
    #out2.size()
    

    pytorch03-06

  • 한 가지 더!! (About Conv2d)
    pytorch03-07

    • ‘Convolution’이 아니라 ‘Cross-correlation Operator’라고???
      pytorch03-08

      • 이 그림에서 볼 수 있듯, ‘Cross-correlation’이라고 적힌 이유는, Filter를 뒤집지 않고 계산하기 때문!
      • 딥러닝 공부하면서 Convolution과 Cross-correlation을 크게 고민할 일은 없을 것

Lab10-2 Mnist CNN

  • 학습 단계? (얼마든지 자의적으로 정의할 수 있는 부분)

    1. 라이브러리 가져오기 (torch, torchivision, matplotlib 등)  
    2. GPU 사용 설정 & Random seed 설정  
      -> cuda 사용가능할 때는 GPU 사용하여 연산, 그렇지 않으면 CPU 사용 
    3. 학습 parameter 설정 (learning_rate, training_epochs, batch_size 등) 
    4. Dataset 가져오기 & Data loader 만들기 
    5. 학습 모델 만들기 (class CNN(torch.nn.Module))
    6. Loss function (Criterion) 선택 & 최적화 도구 선택 Optimizer 
    7. 학습 및 Loss Check (Criterion의 Output)
    8. 학습된 모델의 성능 확인
    

    pytorch03-09

  • 오늘 만들어 볼 CNN 구조?
    pytorch03-10

    • 그냥 Manual하게 손수 다 해보면?
      pytorch03-11

    코드 링크

  • 한 가지 의문: “Layer를 더 깊게 쌓으면 더 좋은 결과가 나오지 않을까?” 라는 궁금증
    pytorch03-13

    • 결과: 이전의 모델보다 Accuracy가 떨어진다.

      결론: 모델을 쌓을 때에는 모델을 깊게 쌓는 것도 중요하지만, 모델을 얼마나 효율적으로 쌓는가가 더 중요하다.


Lab10-3 Visdom

코드 링크

  • 설치: pip install visdom
  • Visdom 서버 켜기: pythom -m visdom.server
    -> Local Host 서버가 켜지게 됨! (해당 주소를 주소창에 입력하면 됨!, ex: http://localhost:8097)

  • Lab 10-3 목표: “Visdom 사용법 익히고 MNIST-CNN loss graph까지 적용해보기!”
    • 다음과 같이 여러 이미지들을 띄워볼 수 있음!
      pytorch03-14

    • 선들도 다음과 같이 쉽게 그려볼 수 있음. (짱 신기하다..)
      pytorch03-15


Lab10-4 ImageFolder1

코드 링크1
코드 링크2

  • 나만의 사진을 이용해서 딥러닝 태스크를 진행한다면?
    • 데이터셋 준비방법 예시
      pytorch03-16
      • 클래스 별로 폴더 만들어서 이미지를 넣어두면 됨.
  • cf) %ls(현재 위치에서 커맨드 입력하기) -> 하위폴더들이 나옴 (cf. % pwd: 현재 워킫 디렉터리 볼 수 있음)

  • ImageFolder를 쓰면, 내 디렉터리의 사진들을 이용해서 모델링을 해볼 수 있음.
    pytorch03-17

  • 104-2는 내 사진이 없으므로.. 스킵.. ㅋ_ㅋ

Lab10-5 Advance CNN(VGG)

  • Oxford VGG(Visual Geometry Group)에서 만든 Network
  • 다양한 형태들 존재
    pytorch03-18

  • VGG16
    pytorch03-19

  • torchvision.models.vgg
    • vgg11 ~ vgg19까지 만들 수 있도록 되어 있음
    • 3x224x224 입력을 기준으로 만들도록 되어 있음
  • Vggnet Full code
  • Vgg with Cifar-10
    • optim.lr_scheduler.StepLR(optimizer, step_size=5, gamma=0.9)
      epoch을 돌리는 동안, learning rate을 조금씩 감소시키면서 학습
      step_size: lr_scheduler step을 5번할 때마다, learning rate에 0.9를 곱해달라는 것.

Lab10-6-1 Advance CNN(RESNET-1)

  • 이 두 Block을 모두 만들어 볼 것!
    pytorch03-20

  • 다양한 아키텍쳐들이 시도가 되었었는데, 이런 것들도 한 번 만들어 보겠다.
    pytorch03-21

pytorch03-22

  • torchvision.models.resnet

  • Downsample
    • Stride가 2일 때, feature size가 줄어드니까, Identity 값도 함께 낮추어주기 위해 사용
    • ResNet 코드에서는, 더불어 채널 사이즈를 맞추어주는 용도로도 사용함.
  • ResNet50 아키텍쳐 Reference
    pytorch03-23

Lab10-7 Next step of CNN

  • Classification: 사진이 무엇에 대한 사진인지를 출력
    • DenseNet, SENet, MobileNet, SqueezeNet, AutoML(NAS, NASNet)
    • NAS: Neural Architecture Search (논문: Neural ARchitecture Search with Reinforcement Learning)
  • Detection: 사진 안의 객체가 어디 있고 그 객체는 무엇인지를 찾아냄
    • Latest Object Detection을 검색
  • Object Tracking: 영상에서, 각 프레임마다 Detectiong을 통해 객체를 찾아냈다면, 지금 프레임에 있는 객체가 이전 프레임에서는 어떤 객체였는지, 각 프레임 간의 연관관계를 찾아냄.
    • MDNet, GOTURN, CFNet, ROLO, Tracking the Untractable
  • Segmentation: 배경과 객체를 분할
    • FCN, U-Net, Mask RCNN
  • 앞으로 해볼 거리?

    - Classification 
    - Detection  
    - Tracking -> SiamessCNN(Object-ReID)  
    - Segmentation
    - Image Captioning (with RNN)
    - Super Resolution (저해상도 이미지 -> 고해상도 이미지)
    - Generative Model (AutoEncoder, GAN)
    - OpenPose (사람 사진에서 사람의 관절 구조를 따는 것)
    etc
    

References

파이토치로 시작하는 딥러닝 기초 Part3
Detailed Guide to Understand and Implement ResNets