VGGNet 모델은 2014년에 이미지넷 대회에서 준우승을 차지한 모델로(참고로 우승은 GoogLeNet) layer의 개수에따라 VGG16, VGG19로 구분된다.
VGG 모델의 가장 큰 특징은 3x3사이즈의 작은 필터만을 사용해 깊은 층을 구성했다는 점이며,
아래는 tensorflow로 VGG16을 구현한 코드로 코드와 함께 간단한 설명을 적어보았다.
##from ____future____ import 모듈이름 : 파이썬3에서 사용하는 문법을 파이썬2에서도 동일하게 사용하기 위함
from __future__ import absolute_import, division, print_function, unicode_literals
import os
import numpy as np
import matplotlib.pyplot as plt
try:
%tensorflow_version 2.x
except Exception:
pass
import tensorflow as tf
keras = tf.keras
print("tensorflow version",tf.__version__)
IMG_SIZE = 244 ## 이미지 사이즈를 244 x 244로 설정
EPOCHS = 3
BATCH_SIZE = 128
learning_rate = 0.0001
from keras.datasets import cifar10
from keras.utils import np_utils
import tensorflow_datasets as tfds
## progress bar disable
tfds.disable_progress_bar()
#분류할 클래스 개수
num_classes=10 # Cifar10의 클래스 개수
(raw_train, raw_validation, raw_test), metadata = tfds.load(
'cifar10',
split=['train[:90%]', 'train[90%:]', 'test'],
with_info=True,
as_supervised=True,
)
print("Train data 개수:",len(raw_train))
print("Val data 개수:",len(raw_validation))
print("Test data 개수:",len(raw_test))
def format_example(image, label):
image = tf.cast(image, tf.float32)
image = (image/127.5) - 1
image = tf.image.resize(image, (IMG_SIZE, IMG_SIZE))
return image, label
##map 함수를 사용하여 데이터셋의 각 항목에 데이터 포맷 함수를 적용
train = raw_train.map(format_example)
validation = raw_validation.map(format_example)
test = raw_test.map(format_example)
SHUFFLE_BUFFER_SIZE = 1000
train_batches = train.shuffle(SHUFFLE_BUFFER_SIZE).batch(BATCH_SIZE)
validation_batches = validation.batch(BATCH_SIZE)
test_batches = test.batch(BATCH_SIZE)
## train set 개수 / 배치사이즈 = len(train_batches)
45000/ 128 = 352
IMG_SHAPE = (IMG_SIZE, IMG_SIZE, 3)
#CNN 모델 변경하려면 여기서 변경
#ImageNet으로 사전 훈련된 모델 불러오기
base_model = tf.keras.applications.VGG16(input_shape=IMG_SHAPE,
## 분류하는 부분까지 추출
include_top=True,
classes=1000,
## 이미지넷에서 사용한 가중치 적용
weights='imagenet')
model = tf.keras.Sequential()
for layer in base_model.layers[:-1]: # go through until last layer
model.add(layer)
#마지막 layer의 최종 분류 개수를 클래스 개수와 맞게 설정
## 활성함수로는 softmax를 사용
model.add(keras.layers.Dense(num_classes, activation='softmax',name='predictions'))
첫번째 파라미터 1792
1792 = 3(입력채널) x 3x3(필터사이즈) x 64(출력: 필터개수) + 64(바이어스)두번째 파라미터 36928
36928 = 64(입력채널) x 3x3(필터사이즈) x 64(출력: 필터개수) + 64(바이어스)
model.compile(optimizer=tf.keras.optimizers.Adam(lr=learning_rate),
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(train_batches,
epochs=EPOCHS,
validation_data=validation_batches,
batch_size=BATCH_SIZE)
loss_and_metrics = model.evaluate(test_batches, batch_size=64)
print("테스트 성능 : {}%".format(round(loss_and_metrics[1]*100,4)))