now is better than never

[딥러닝] 12. CNN (2) 본문

머신러닝 & 딥러닝

[딥러닝] 12. CNN (2)

김초송 2023. 5. 18. 14:07

딥러닝의 역사

LeNet 신경망

  • 1998년 손글씨를 인식한 최초의 CNN 신경망
  • 배치정규화, Dropout 나오기 전
  • 이미지 -> conv -> maxpooling -> conv ->maxpooling -> fully connected1 -> fully connected2 -> output

VGG 신경망

  • 2014 년 영국 옥스퍼드 대학교
  • 이미지넷 대회에서 준우승한 신경망

  • conv 2 -> pooling 1 -> conv 2 -> pooling 1 -> conv 3 -> pooling 1 -> conv 3 -> pooling 1 -> conv 3 -> pooling 1 -> fc 3
  • 전이 학습
    • 1000 개의 이미지를 학습한
# 1. 패키지 임포트
import tensorflow as tf 
from tensorflow.keras.datasets import cifar10
from tensorflow.keras.models import Sequential # 모델을 구성하기 위한 모듈
from tensorflow.keras.layers import Activation,Dense, Conv2D, MaxPooling2D, Flatten, BatchNormalization, Dropout # CNN, 완전 연결계층을 구성하기 위한 모듈
from tensorflow.keras.utils import to_categorical # one encoding 하는 모듈
import numpy as np

# 2. vgg 신경망 설계도
from  tensorflow.keras.applications import VGG16
vgg16 = VGG16(weights='imagenet', input_shape=(32, 32, 3), include_top=False) # include_top: 완전 연결 계층 부분 포함 X -> 직접 구현
  • weights='imagenet': imagenet 에서 준우승한 가중치를 사용함
    'None': 설계도만 가져오고 처음부터 학습시키겠다
  • include_top: 완전 연결 계층 부분 코드는 사용 안 함 -> 완전 연결 계층 직접 구현
    -> 모델 마다 분류 데이터 / 라벨이 다 다르기 때문에
    top = 완전 연결 계층 부분
# 신경망을 동결
#for  layer  in  vgg16.layers[:]:
#    layer.trainable = False   # False 는 동결 

# 신경망을 동결 해제
for layer in vgg16.layers[:]:
    layer.trainable = True   # True 는 동결 해제 (default)
vgg16.summary()
  • True : 학습해야 할 파라미터 (가중치와 바이어스)가 새롭게 학습 가능한 상태로
    -> 새로운 이미지 추가해서 학습 가능
  • 동결 해제 : 1000개 분류 + 새로운 분류, 옛날 학습 데이터를 그대로 가지고 감,
    사전에 학습된 표현이 훈련하는 동안 수정
  • 동결 : 훈련하는 동안 가중치가 업데이트되지 않도록 막는 것, 지금 분류하는 이미지에만 집중

 

인셉션

  • 구글에서 만든 신경망
from tensorflow.keras.applications import *
xception = Xception(weights='imagenet', input_shape=(32, 32, 3), include_top=False)

model = Sequential()
model.add(xception) # 인셉션 모델 사용

 

ResNet

  • MS 에서 만든 신경망
  • 신경망이 깊어질 때 생길 수 있는 기울기 소실 문제 해결
from tensorflow.keras.applications import *
resnet = ResNet50(weights='imagenet', input_shape=(32, 32, 3), include_top=False)

model = Sequential()
model.add(resnet)

 

MobileNet

  • 가벼우면서 성능이 좋은 신경망
from tensorflow.keras.applications import *
mobile = MobileNet(weights='imagenet', input_shape=(32, 32, 3), include_top=False) 

model = Sequential()
model.add(mobile)

 

cifar10

  • 이미지 증식: 회전, 확대, 흐리게 등등
    -> 오버피팅 발생 가능성, 하지만 정확도는 올라감
from tensorflow.keras.preprocessing.image import load_img, img_to_array, ImageDataGenerator
 
# 이미지 증식
gen = ImageDataGenerator(horizontal_flip = True,
                         vertical_flip = True,
                         shear_range = 0.5,
                         brightness_range = [0.5, 1.5],
                         zoom_range = 0.2,
                         width_shift_range = 0.1,
                         height_shift_range = 0.1,
                         rotation_range = 30,
                         fill_mode = 'nearest')

li=[]
li2=[]

#증식할 이미지 수
for i in range(3):
    x_gen, y_gen = gen.flow(x_train, y_train, batch_size=x_train.shape[0], shuffle=False).next()
    li.append(x_gen)
    li2.append(y_gen)

x_train2 = np.concatenate((x_train, *li))
y_train2 = np.concatenate((y_train, *li2))