now is better than never
[딥러닝] 12. CNN (2) 본문
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))
'머신러닝 & 딥러닝' 카테고리의 다른 글
[딥러닝] 13. 사물 검출 (Object Detection) (0) | 2023.05.24 |
---|---|
[딥러닝] 11. 음성 인식 CNN (0) | 2023.05.15 |
[딥러닝] 10. CNN (0) | 2023.05.10 |
[딥러닝] 9. 언더피팅 & 오버피팅 (1) | 2023.05.10 |
[딥러닝] 8. 오차 역전파 (Back Propagation) (0) | 2023.05.04 |