220908

AIVILLAIN·2022년 9월 8일
0

오공완

목록 보기
4/25

합성곱 신경망

ConvNet

(image height, image width, image channel) 크기의 입력 텐서 사용
높이와 너비 차원은 네트워크가 깊어질수록 작아지는 경향이 있음
채널의 수는 Conv2D 층에 전달된 첫번째 매개변수에 의해 조절됨

합성곱 연산

완전 연결 층과 합성곱 층 사이 근본적인 차이
Dense 층은 입력 특성 공간에 있는 전역 패턴을 학습하지만 합성곱 층은 지역 패턴을 학습
이미지일 경우 작은 2D 윈도우로 입력에서 패턴을 찾음

특징

  1. 평행 이동 불변성 (translation invariant)
    이미지의 오른쪽 아래 모서리에서 어떤 패턴을 학습했다면 다른 곳에서도 패턴 인식 가능
    (완전 연결 네트워크는 새로운 위치에 나타난 것은 새로운 패턴으로 학습해야 함)
    (근본적으로 우리가 보는 세상은 평행 이동으로 인해 다르게 인식되지 않음
  2. 공간적 계층 구조 학습
    에지(edge) 같은 작은 지역 패턴을 학습
    두 번째 합성곱 층은 첫 번째 층의 특성으로 구성된 더 큰 패턴을 학습

합성곱 연산은 특성 맵이라고 부르는 3D 텐서에 적용됨
2개의 공간축(높이, 너비)과 깊이(채널)으로 구성됨
채널의 경우 RGB 이미지는 3채널, 흑백 이미지는 1채널
합성곱 연산은 입력 특성 맵에서 작은 패치들을 추출하고 같은 변환을 적용하여 출력 특성 맵을 만듬
출력 특성 맵도 높이와 너비를 갖는 3D 텐서
출력 텐서의 깊이는 층의 매개변수로 결정
깊이 축의 채널은 더이상 RGB 입력처럼 특정 컬러를 의미하지 않음
필터와 같은 역할을 함
필터는 입력 데이터의 특성을 인코딩
합성곱은 핵십적인 2개의 파라미터로 정의됨

  1. 입력으로부터 뽑아낼 패치의 크기
    전형적으로 3x3, 5x5 크기를 사용
  2. 특성 맵의 출력 깊이
    합성곱으로 계산할 필터의 수

3D 입력 특성 맵 위를 3x3, 혹은 5x5 크기 윈도우가 슬라이딩 하면서 모든 위치에서 3D 특성 패치를 추출하는 방식으로 합성곱이 작동
이 패치는 1D 벡터로 변환됨
변환된 모든 벡터는 3D 특성 맵으로 재구성됨
출력 특성 맵의 공간상 위치는 입력 특성 맵의 같은 위치에 대응
출력 높이와 너비는 입력의 높이, 너비와 다를 수 있음

  1. 입력 특성 맵에 패딩을 추가하여 대응할 수 있음
  2. 스트라이드 사용 여부에 따라 다름

입력과 동일한 높이, 너비를 갖는 출력 특성 맵을 얻고 싶다면 패딩을 사용할 수 있음
패딩은 입력 특성 맵의 가장자리에 적절한 개수의 행과 열을 추가
모든 입력 타일에 합성곱 윈도우의 중앙을 위치할 수 있음
Conv2D 층에서 패딩은 padding 매개변수로 설정할 수 있음
valid는 사용하지 않고, same은 입력과 동일한 높이, 너비를 갖는 출력을 만들기 위해 패딩
기본값은 valid

CNN 파라미터 숫자 계산

스트라이드

이전까지 합성곱에 대한 설명은 합성곱 윈도우 중앙 타일이 연속적으로 지나간다고 가정
두 번 연속적인 윈도우 사이의 거리가 스트라이드라고 불리는 합성곱의 파라미터
기본값은 1
1보다 큰 스트라이드 합성곱도 가능 (윈도우가 겹치지 않게)
스트라이드 2를 사용했다는 것은 특성 맵의 너비와 높이가 2의 배수로 다운샘플링 되었다는 뜻 (경계 문제가 있으면 더 줄어들음)
실전에서 드물게 사용됨
어떤 모델에서는 유용하게 사용될 수 있음
특성 맵을 다운샘플링하기 위해 스트라이드 대신 max pooling 연산을 사용하는 경우가 있음

최대 풀링 연산 (max pooling)

강제적으로 특성 맵을 다운샘플링
윈도우에 맞는 패치를 추출하고 각 채널별로 최댓값을 출력
최대풀링은 보통 2x2 윈도우와 스트라이드 2를 사용하여 특성 맵을 절반 크기로 다운샘플링
합성곱은 전형적으로 3x3 윈도우와 스트라이드 1 사용

다운샘플링 하는 이유는?

  1. 특성의 공간적 계층 구조를 학습하는 데 도움이 되지 않음
    컨브넷만 사용하여 학습한 고수준 패턴은 초기 입력에 관한 정보가 적어 특성 학습이 어려움
    마지막 합성곱 층의 특성이 전체 입력에 대한 정보를 갖고 있어야 함
  2. 특성 맵의 가중치 개수를 줄이기 위함

최대 풀링이 평균 풀링보다 잘 작동하는 편
특성이 특성 맵의 각 타일에 어떤 패턴이나 개념의 존재 여부를 인코딩하는 경향이 있기 때문
가장 납득할만한 서브샘플링 전략은 스트라이드가 없는 합성곱으로 조밀한 특성 맵을 만들고 작은 패치에 대해 최대로 활성화된 특성을 고로는 것
(이 방법이 듬성듬성 윈도우를 슬라이딩하거나 입력 패치를 평균해서 특성 정보를 놓치거나 희석시키는 것보다 나음)

소규모 데이터셋에서 CNN 훈련하기

작은 컨브넷, 규제 방법 사용하지 않고 훈련하여 기준이 되는 기본 성능(통계적 검정력)을 갖는 모델
데이터 증식
사전 훈련된 네트워크 사용 (pretrain model)
사전 훈련된 네트워크 세밀하게 튜닝 (fine tuning)

작은 데이터셋 문제에서 딥러닝의 타당성

딥러닝은 일반적으로 데이터가 풍부할 때만 작동
딥러닝의 근본적인 특징은 훈련 데이터에서 특성 공학의 수작업 없이 흥미로운 특성을 찾음
따라서 훈련 샘플이 많아야 함
많은 샘플이란 상대적
훈련하려는 네트워크 크기, 깊이에 따라 상대적
모델이 작고 규제가 잘 되어 있으며 간단한 작업의 경우에는 적은 샘플로도 충분할 수 있음
딥러닝 모델은 태생적으로 다목적
이미지 분류 모델, STT 모델을 조금만 변경해서 완전히 다른 문제에 재사용 가능
비전 분야에서는 사전 훈련된 모델들이 많이 공개되어 있어 적은 데이터에서 강력한 비전 모델을 만드는 데 사용할 수 있음

이미지 데이터 전처리

이미지 읽기 → JPEG를 RGB 픽셀 값으로 디코딩 → 부동 소수 타입 텐서 변환 → 픽셀 값 스케일 0~1 사이로 조정
keras에는 이미지 파일을 전처리된 배치 텐서로 바꾸어 주는 제너레이터 만들어주는 패키지 존재

파이썬 제너레이터는 반복자처럼 작동하는 객체로 for … in 연산자에 사용 가능
제너레이터는 yield 연산자를 사용하여 만듬

fit_generator 메서드는 fit 메서드와 동일하되 데이터 제너레이터를 사용할 수 있음
제너레이터는 타깃 배치를 끝없이 반환하기 때문에 케라스 모델에 하나의 에포크를 정의하기 위해 제너레이터로부터 얼마나 많은 샘플을 뽑을 것인지 알려주어야 함 (steps_per_epoch)
제너레이터로부터 steps_per_epoch개의 배치만큼 뽑아 해당 횟수만큼 경사 하강법을 실행한 후 다음 에포크로 넘어감
validation 또한 generator로 넘겨줄 수 있으며, validation_steps 매개변수로 얼마나 많은 배치를 추출하여 평가할 지 정의

데이터 증식

학습 샘플이 너무 적어 새로운 데이터에 일반화할 수 있을 만큼 모델을 훈련시킬 수 없는 과대적합 상황
기존 훈련 샘플로부터 더 많은 훈련 데이터를 생성하는 방법
여러 랜덤 변환을 적용하여 샘플 수를 늘림
훈련 시 모델이 정확히 같은 데이터를 두 번 만나지 않도록 하는 것이 목표
ImageDataGenerator가 읽은 이미지에 여러 종류의 랜덤 변환 적용하도록 설정 가능

사전 훈련된 모델 사용

대량의 데이터셋에서 미리 훈련되어 저장된 네트워크
원본 데이터가 충분히 크고 일반적이라면 사전 훈련된 네트워크에 의해 학습된 특성의 계층 구조는 실제 세상에 대한 일반적인 모델로 효율적인 역할 가능
이를 통해 작은 데이터셋을 가진 문제에도 딥러닝 모델이 효율적으로 작동할 수 있게 도움

사전 훈련된 모델 사용 방법 2가지

  1. 특성 추출(feature extractions)
  2. 미세 조정(fine tuning)

특성 추출

사전에 학습된 네트워크 표현을 사용하여 새로운 샘플에서 특성을 뽑아내는 것
이 특성으로 새로운 분류기를 처음부터 훈련
합성곱 층의 특성 맵은 사진에 대한 일반적인 콘셉트의 존재 여부
분류기에서 학습한 표현은 모델이 훈련된 클래스 집합에 특화되어 있음

모델 컴파일 및 훈련 전 합성곱 기반의 층 동결 (학습 중 가중치 업데이트되지 않도록)
이렇게 하지 않으면 사전에 학습된 표현이 새로운 데이터에서 학습되면서 수정됨
trainable 속성을 False로 설정하여 네트워크 동결 가능
변경 사항 적용하려면 모델을 컴파일해야 함
컴파일 이후 trainable 속성을 변경하면 모델을 다시 컴파일 해줘야 함

미세 조정

특성 추출에 사용했던 동결 모델의 상위 층 몇개를 동결에서 해제하고 모델에 새로 추가한 층과 함께 훈련하는 것
분류기 먼저 어느정도 훈련시킨 후 상위 층을 미세 조정
분류기가 미리 훈련되지 않으면 훈련되는 동안 너무 큰 오차 신호가 네트워크에 전파되어 사전 학습 표현들을 망가뜨림

  1. 사전 훈련 모델 위에 새로운 네트워크 추가
  2. 기반 네트워크 동결
  3. 새로 추가한 네트워크 훈련
  4. 일부 층의 동결 해제
  5. 동결 해제 층과 새로 추가한 층을 함께 훈련

실습코드 깃허브 링크

profile
소신있는 오픈마인드

0개의 댓글