Keras 인공 신경망 모델 정의 방법
모델을 정의하는 방법은 두 가지임
Sequential 클래스(가장 자주 사용하는 구조인 층을 순서대로 쌓아 올린 네트워크)
함수형 API(완전히 임의의 구조를 만들 수 있는 비순환 유향 그래프를 만듦)를 사용함
Sequential Class를 사용한 경우
from keras import models from keras import layers
model = models.Sequential()
model.add(layers.Dense(32, activation = 'relu', input\_shape = (784,)))
model.add(layers.Dense(10, activation = 'softmax'))
함수형 API를 사용한 경우
함수형 API를 사용하면 모델이 처리할 데이터 텐서를 만들고 마치 함수처럼 이 텐서에 층을 적용함
모델 구조가 정의된 후에는 Sequential 모델을 사용했는지 함수형 API를 사용했는지는 상관 없음
이후 단계는 동일
input_tensor = layers.Input(shape(784,)) x = layers.Dense(32, activation = 'relu')(input\_tensor) output\_tensor = layers.Dense(10, activation = 'softmax)(x)`
model = models.Model(inputs = input\_tensor, outputs = output\_tensor)
전이학습(Transfer Learning)
전이학습 : 이미 훈련된 모델을 고쳐쓰기
전이학습은 이미 학습이 완료된 모델을 다른 목적에 맞춰 조금만 고쳐서 사용하는 것
이미지 인식과 같이 많은 데이터를 오랜 시간 학습시켜야하는 문제의 경우 기존에 성능이 검증된 모델을 가져와 사용하여 학습시간도 단축시키고 높은 성능을 기대할 수 있다.
사전학습(pre_trained) 모델의 검증된 아키텍처와 가중치를 그대로 가져오고 일부 새로운 층을 추가하거나 가중치를 조정하는 방식으로 학습하는 것을 전이 학습이라고 한다.
이미 학습된 모델을 가져다가 특징을 추출하는 용도로 사용하고, 이 특징 추출기의 출력을 이용하여 우리가 원하는 작업을 수행하는 다음과 같은 구조로 바꿀 수 있으면 좋을 것
사전 학습된 모델을 가져와 일부분을 우리의 새로운 일에 활용하려면 일부 계층을 잘라서 가져오고, 이 계층들이 가지고 있는 파라미터들은 변경되지 않도록 만들어야함
이 계층들 이후에는 우리의 새로운 작업에 맞는 출력을 내도록 새롭게 구성해서 붙이는 것
붙인 부분이 학습을 통해 파라미터가 변경되는 영역으로 만들면 되며 물론 그림 오른쪽과 같이 사전 학습된 모델의 일부를 학습 가능하게 만들 수 있음
해결하려는 문제에서 빠른 속도로 일정 수준의 베이스라인(baseline) 성능을 얻고 싶을 때, 가장 쉽고 빠른 방법 -> 전이학습(Transfer Learning)
사전 학습(pre-trained)된 네트워크의 가중치를 사용하는 것
전이학습의 대표적인 세가지 방법
모델을 변형하지 않고 사용
모델 분류기를 재학습(가장 대표적)
모델 일부를 동결해제하여 재학습
사전 훈련된 Convnet 활용하기
작은 이미지 데이터셋에 딥러닝을 적용하는 일반적이고 매우 효과적인 방법은 사전 훈련된 네트워크를 사용하는 것임
사전 훈련된 네트워크(pretrained network)는 일반적으로 대규모 이미지 분류 문제를 위해 대량의 데이터 셋에서 미리 훈련되어 저장된 네트워크임
원본 데이터셋이 충분히 크고 일반적이라면 사전 훈련된 네트워크에 의해 학습된 특성의 계층 구조는 실제 세상에 대한 일반적인 모델로 효율적인 역할을 할 수 있음
새로운 문제가 원래 작업과 완전히 다른 클래스에 대한 것이더라도 이런 특성은 많은 컴퓨터 비전 문제에 유용함
여기에서는 (1,400만 개의 레이블된 이미지와 1,000개의 클래스로 이루어진) ImageNet 데이터셋에서 훈 련된 대규모 컨브넷을 사용해 보겠음