딥러닝_CNN_합성곱연산(Convnet)_5. 사전 훈련된 모델 소개

주지윤·2022년 12월 13일
0

딥러닝

목록 보기
18/21

사전훈련모델 소개

LeNet-5

  • LeNet-5는 복잡하지 않은 망을 이용하여 (당시 기준)높은 성능을 보여주었음
  • Convolutional layer와 pooling의 조합을 반복하는 현대적인 CNN 구조를 제안했다는 점에서 의미가 있는 모델


Visual Geometry Group Net(VGGNet)

  • 활성화 함수로 ReLU 사용, Dropout 적용
  • 합성곱과 풀링 계층으로 구성된 블록과 분류를 위한 완전 연결계층으로 결합된 전형적인 구조
  • 인위적으로 데이터셋을 늘림
    • 이미지 변환, 좌우 반전 등의 변환을 시도
  • 몇 개의 합성곱 계층과 최대 풀링 계층이 따르는 5개의 블록과 3개의 완전 연결계층으로 구성
  • 모든 합성곱과 최대 풀링 계층에 padding='SAME' 적용
  • 합성곱 계층에는 stride=1, 활성화 함수로 ReLU 사용
  • 특성맵 깊이를 증가 시킴
  • 척도 변경을 통한 데이터 보강(Data Augmentation)
  • 3x3 커널을 갖는 두 합성곱 계층을 쌓은 스택이 5x5 커널을 갖는 하나의 합성곱 계층과 동일한 수용영역(ERF)을 가짐
  • 11X11 사이즈의 필터 크기를 가지는 AlexNet과 비교하여 더 작은 합성곱 계층을 더 많이 포함해 더 큰 ERF를 얻음
  • 이와 같이 합성곱 계층의 개수가 많아지면 매개변수 개수를 줄이고 비선형성을 증가시킴
  • VGG-19 아키텍쳐는 VGG-16에 3개의 합성곱 계층을 추가

VGG-19 아키텍쳐

  • VGG-16에 3개의 합성곱 계층을 추가
  • (참고) ILSVRC의 주요 분류 metric 중 하나는 top-5
    • 상위 5개 예측 안에 정확한 클래스가 포함되면 제대로 예측한 것으로 간주
    • 일반적인 top-k metric의 특정 케이스


GoogLeNet, Inception

  • VGGNet을 제치고 같은 해 분류 과제에서 1등을 차지
  • 인셉션 블록이라는 개념을 도입하여, 인셉션 네트워크(Inception Network)라고도 불림

https://developer.ridgerun.com/wiki/images/thumb/e/eb/Googlenet.png/2700px-Googlenet.png


🔸 특징

  • CNN 계산 용량을 최적화하는 것을 고려
  • 전형적인 합성곱, 풀링 계층으로 시작하고, 이 정보는 9개의 인셉션 모듈 스택을 통과 (해당 모듈을 하위 네트워크라고도 함)
  • 각 모듈에서 입력 특징 맵은 서로 다른 계층으로 구성된 4개의 병렬 하위 블록에 전달되고, 이를 서로 다시 연결
  • 모든 합성곱과 풀링 계층의 padding="SAME"이며 stride=1, 활성화 함수는 ReLU 사용

🔸 기여

  • 규모가 큰 블록과 병목을 보편화
  • 병목 계층으로 1x1 합성곱 계층 사용
  • 완전 연결 계층 대신 풀링 계층 사용
  • 중간 소실로 경사 소실 문제 해결

ResNet - 잔차 네트워크

  • ResNet은 마이크로소프트에서 개발한 알고리즘이며 깊은 신경망을 제공합니다.
  • 네트워크의 깊이가 깊어질수록 경사가 소실되거나 폭발하는 문제를 해결하고자 함
  • 기존의 망과 차이가 있다면, l+2번째 비선형 함수 입력값에 l 번째 비선형 함수 출력값을 더해줄 수 있도록 지름길(shortcut)을 하나 만들어준다
  • 병목 합성곱 계층을 추가하거나 크기가 작은 커널을 사용
  • 152개의 훈련 가능한 계층을 수직으로 연결하여 구성
  • 모든 합성곱과 풀링 계층에서 패딩옵션으로 'SAME', stride=1 사용
  • 3x3 합성곱 계층 다음마다 배치 정규화 적용, 1x1 합성곱 계층에는 활성화 함수가 존재하지 않음

https://miro.medium.com/max/1400/1*6hF97Upuqg_LdsqWY6n_wg.png


MobileNet

  • 성능보다 모델의 크기 또는 연산 속도 감소
  • Depthwise conv와 Pointwise conv 사이에도 batch normalization과 ReLU를 삽입
  • Conv layer를 활용한 모델과 정확도는 비슷하면서 계산량은 9배, 파라미터 수는 7배 줄임

https://blog.kakaocdn.net/dn/HTvh9/btqChF66iqJ/IJaCThdcNkzDtmicsrsL0k/img.png


DenseNet

  • 각 층은 모든 앞 단계에서 올 수 있는 지름질 연결 구성
  • 특징지도의 크기를 줄이기 위해 풀링 연산 적용 필요
  • 밀집 블록(dense block)과 전이층(transition layer)으로 구성
  • 전이층 : 1x1 컨볼루션과 평균값 풀링(APool)으로 구성


사전 훈련 모델 실습

6개의 이미지를 6개의 사전훈련모델 적용

1) 6개 이미지 로드

!wget -O dog.jpg https://www.publicdomainpictures.net/pictures/250000/nahled/dog-beagle-portrait.jpg
!wget -O fish.jpg https://upload.wikimedia.org/wikipedia/commons/7/7a/Goldfish_1.jpg
!wget -O bee.jpg https://upload.wikimedia.org/wikipedia/commons/4/4d/Apis_mellifera_Western_honey_bee.jpg
!wget -O beaver.jpg https://upload.wikimedia.org/wikipedia/commons/6/6b/American_Beaver.jpg
!wget -O crane.jpg https://p1.pxfuel.com/preview/42/50/534/europe-channel-crane-harbour-crane-harbour-cranes-cranes-transport.jpg
!wget -O zebra.jpg https://upload.wikimedia.org/wikipedia/commons/f/f0/Zebra_standing_alone_crop.jpg

2) 모델 정의

  • 모델이름과 모듈이름 구분 필요
import numpy as np
import tensorflow as tf

from keras.applications import vgg19
from keras.applications import inception_v3
from keras.applications import resnet
from keras.applications import xception
from keras.applications import densenet
from keras.applications import mobilenet

vgg19_m = vgg19.VGG19(include_top=True, weights='imagenet',
               input_tensor=None, input_shape=None,
               pooling=None, classes=1000)
inception_m = inception_v3.InceptionV3(include_top=True, weights='imagenet',
               input_tensor=None, input_shape=None,
               pooling=None, classes=1000)
resnet_m = resnet.ResNet50(include_top=True, weights='imagenet',
               input_tensor=None, input_shape=None,
               pooling=None, classes=1000)
xception_m = xception.Xception(include_top=True, weights='imagenet',
               input_tensor=None, input_shape=None,
               pooling=None, classes=1000)
densenet_m = densenet.DenseNet201(include_top=True, weights='imagenet',
               input_tensor=None, input_shape=None,
               pooling=None, classes=1000)
mobilenet_m = mobilenet.MobileNet(include_top=True, weights='imagenet',
               input_tensor=None, input_shape=None,
               pooling=None, classes=1000)

3) 모델 예측 함수정의

def predict_pictures(model_name,module_name):
  li = ['dog','fish','bee','beaver','crane','zebra']
  result = []
  for i in li:
    if model_name in [inception_m,xception_m]:
      target_size = (299,299)
    else:
      target_size = (224,224)
    img = tf.keras.preprocessing.image.load_img(f'{i}.jpg', target_size = target_size)
    x = tf.keras.preprocessing.image.img_to_array(img)
    x = x.reshape(1, x.shape[0], x.shape[1], x.shape[2])
    x = module_name.preprocess_input(x) 
    preds = model_name.predict(x)
    decode = module_name.decode_predictions(preds)
    result.append(decode[0][0][2])
  
  return result

4) 6개 모델 예측

import pandas as pd

model_li = [vgg19_m,inception_m,resnet_m,xception_m,densenet_m,mobilenet_m]
module_li = [vgg19,inception_v3,resnet,xception,densenet,mobilenet]
final = pd.DataFrame(columns = ['dog','fish','bee','beaver','crane','zebra'])
for i,m in enumerate(model_li):
  final.loc[m.name] = predict_pictures(m,module_li[i])

5) 순서 정렬

final['mean'] = final.mean(axis=1)
final.sort_values(by='mean')



** 이미지출처

0개의 댓글