수업 56일차

galoo·2023년 9월 19일
0

HelloVision Dx Data School

목록 보기
54/72
  • 상관계수, vif 지수(10 이상이면 다중공선성 발생 가능성 매우 높음)
  • 영향력을 조절해주자 L2, 영향력 낮은 것은 없애자 L1

구글 드라이브 마운트

from google.colab import drive
drive.mount('/content/drive')
#구글드라이브연동

✔ CNN (합성곱 신경망)

중요한 단어 (잊지말자)

  • CNN, Data Augmentation, Transfer Learning

개요

  • 대뇌의 시각 피질 연구에서 시작
    - 시각으로 판단하는 문제에서 이를 설명하는 것은 간단한 문제가 아니다.
    - 감각 기관의 작동 원리를 알아야 설명이 가능함
    - 시각 피질 안의 많은 뉴런이 국부 수용자를 가지고 있어서 실제 물체의 일부 시각 자극에만 반응함
  • 이미지 검색 서비스, 자율 주행 자동차, 영상 자동 분류, 음성 인식, 자연어 처리에도 사용
  • 각 뉴런은 이전 층의 작은 사각 영역에서 집중해서 고수준의 특성을 만들어내는 방식

  • Dense Layer에서는 한 줄로 길게 늘어선 뉴런으로 구성되기 때문에, 입력 데이터의 shape가 1차원이어야 하지만, 합성곱에서는 2D
  • 한 번에 살펴볼 크기가 설정되어야 하고, 2D형태로 만들게 된다면, 좌우 상하 끝쪽이 뉴런의 연산에 적게 포함되기 때문에, 이 개수를 맞추는 방법으로 패딩(padding)이라는 개념을 사용함
    - 보폭(stride)를 설정해서 하나를 읽고 난 뒤, 얼마나 떨어진 하나를 읽을 것인지 설정

  • 필터(커널)
    - 일부분과 연산을 수행해서 특성을 표현할 행렬
    - 특성의 개수를 줄여야 하기에, 단위 행렬을 이용함
  • 채널
    - 입력 이미지를 구성하는 2차원 배열의 개수
    - 흑백 이미지는 1채널, 컬러 이미지는 3채널
    - 컬러 이미지는 3개의 커널을 만들어서 3개의 커널과 연산하고 모두 더해서 최종 특성맵을 생성함

  • 합성곱을 구현할 때, 입력 이미지는 3D 텐서로 구현 - [높이, 너비, 채널]
  • 미니 배치는 4D 텐서로 구현 - [미니배치크기, 높이, 너비, 채널]

Keras에서 제공하는 합성곱 층

  • tf.keras.layers.Conv2D 클래스를 제공
    - filters, kernel_size, strides, padding, activation 매개변수를 이용해서 생성
  • CNN은 많은 양의 메모리를 필요로 합니다.
    - 55 필터로 stride 1과 same 패딩으로 150100 크기 특성 맵 200개 만드는 층을 생각해보면 150*100==>200개로 표현
    - {5
    53(채널의 수)+1(bias)}200 = 15200개의 파라미터 필요함
    - 이미지 크기는 150100이니까
    - 15200
    150*100=228,000,000 만큼의 실수 연산이 필요함
    - 이미지 1개당 228MB 정도 메모리 필요
    - 하나의 배치가 100개이면 하나의 배치 처리를 하는데 22GB가 필요함

Pooling Layer

  • 합성곱 층은 가중치를 계산하지만, 이 Layer는 최대나 평균 같은 합산 함수를 이용함
    - 합성곱은 feature map을 줄이기 위해서 행렬 연산을 수행함
  • 대부분의 경우 동일한 형태의 이미지라면 최대 출력은 유사하다는 것
    - 이동 불변성
  • 연산의 횟수가 줄어들기 때문에 속도가 향상

단점

  • 일정 부분을 잃어버리게 됩니다.
    - 시맨틱 분할의 경우에는 상관 없습니다.
  • 이미지 내에서 이동 작업이 발생한 경우는 불변성이 아니라, 등변성을 적용하는 작업이 필요합니다. (이래서 오래 걸립니다.)
    - Keras에서 MaxPool2D 형태로 Layer를 제공함

일반적인 CNN 구조

  • 합성곱 층(ReLU)을 몇 개 쌓고 그 다음에 풀링 층을 몇 개 쌓고 합성곱 층을 쌓고 다시 풀링 층을 쌓는 것.
[<keras.src.layers.convolutional.conv2d.Conv2D at 0x7801b4381900>,
 <keras.src.layers.pooling.max_pooling2d.MaxPooling2D at 0x7801b4383550>,
 <keras.src.layers.convolutional.conv2d.Conv2D at 0x7801b43832b0>,
 <keras.src.layers.pooling.max_pooling2d.MaxPooling2D at 0x7801b43805b0>,
 <keras.src.layers.reshaping.flatten.Flatten at 0x7801b4381180>,
 <keras.src.layers.core.dense.Dense at 0x7801b43819c0>,
 <keras.src.layers.regularization.dropout.Dropout at 0x7801b43818d0>,
 <keras.src.layers.core.dense.Dense at 0x7801b4382440>]
  • Dense : 완전 연결층, 입력을 모든 뉴런에 연결, 입력은 1차원
  • Faltten : 1차원으로 만들어주는 층
  • Dropout : 일부 뉴런의 가중치 생략
  • Conv2D : 합성곱
  • Pool2D : 풀링층

함수형 API

딥러닝을 구현하는 방법

  • Sequential API
    - 순차적으로 쌓는 방식, 입력이 여러개 이거나 출력이 여러개이면 불편함
  • Functional API
    - Model 인스턴스를 만들고 Model에 입력을 설정하면서 레이어를 추가해나가는 방식
  • SubClassing API
    - Keras가 제공하는 클래스를 상속받아서 필요한 메서드를 재저으이해서 직접 모델을 만드는 방식

✔ 데이터 증강

합성곱을 이용한 이미지 분류

  • 데이터는 Caltech101 (101종류의 이미지)
  • 전체 데이터를 학습하는 것은 시간이 오래 걸려서 5가지로 줄여서 수행
d

✔ Caltech101

  • Caltech101 에서는 1개 카테고리 샘플 이미지가 60개밖에 되지 않음
  • 샘플 개수가 적기 때문에 학습이 제대로 이루어지지 않음

이미지 증강

  • 존재하는 이미지의 각도를 변경하거나 확대 축소하거나 평균화 하거나 노이즈를 추가하거나 명암 대비를 변경하거나 감마 값을 바꾼 이미지를 만들어서 사용하는것

PIL의 이미지 증강 함수

  • Image.transpose(v) : 이미지를 90도 단위로 회전
  • Image.rotate(angle) : angle단위로 회전

이미지 증강을 위한 라이브러리

  • augmentor

Keras의 ImageDateGenerator

  • 이미지 증강을 위한 기능이지만, 학습 도중 이미지에 임의 변형 및 정규화를 적용
  • 변형된 이미지를 배치 단위로 불러올 수 있는 Generator를 생성
  • 일반적인 transformation은 학습 데이터에만 수행
    - test set에는 X
    - 하지만 , rescale은 학습, 테스트 모두 다 수행해야 합니다.
profile
밀가루 귀여워요

0개의 댓글