Colab으로 하루에 하나씩 딥러닝

합성곱 신경망_5.이미지 분류를 위한 신경망_3)VGGNet 본문

딥러닝_개념

합성곱 신경망_5.이미지 분류를 위한 신경망_3)VGGNet

Elleik 2023. 1. 10. 23:33
728x90

VGGNet(브이지지넷)

  •  작은 필터를 사용하는 대신 깊은 신경망을 만들자!
    • 신경망이 깊어질수록 수용 영역이 넓어지는 원리를 이용
    • 필터를 작게 만들어서 파라미터 수를 줄이고 대신 신경망을 깊게 하여 수용 영역이 충분하도록 설계
  • 모델 구조(11 계층 ~ 13 계층, 16 계층, 19 계층)
    • VGG16: 16 계층 모델이 가장 많이 사용되며, VGG19보다 파라미터 수는 적지만 성능 차가 크지 않음
    • VGG16 모델 구조: 5개의 그룹 Conv1-Conv2-Conv3-Conv4-Conv5이 완전 연결 계층으로 연결되는 구조
    • FC7: 출력 직전의 계층으로, 이미지 표현이 가장 추상화된 상태로 이미지를 설명하는 콘텍스트 벡터로 쓰임

VGGNet(브이지지넷) 실습(VGG19)

### 라이브러리 호출

%load_ext tensorboard

import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
import cv2

from tensorflow.keras import Model
from tensorflow.keras.models import Sequential
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.losses import categorical_crossentropy
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.layers import Dense, Flatten, Conv2D, MaxPooling2D, Dropout

### VGG19 네트워크 생성

from typing_extensions import Self
class VGG19(Sequential):
  def __init__(self, input_shape):
    super().__init__()

    self.add(Conv2D(64, kernel_size=(3,3), padding='same',
                    activation='relu', input_shape=input_shape))
    self.add(Conv2D(64, kernel_size=(3,3), padding='same',
                    activation='relu'))
    self.add(MaxPooling2D(pool_size=(2,2), strides=(2,2)))

    self.add(Conv2D(128, kernel_size=(3,3), padding='same',
                    activation='relu'))
    self.add(Conv2D(128, kernel_size=(3,3), padding='same',
                    activation='relu'))
    self.add(MaxPooling2D(pool_size=(2,2), strides=(2,2)))

    self.add(Conv2D(256, kernel_size=(3,3), padding='same',
                    activation='relu'))
    self.add(Conv2D(256, kernel_size=(3,3), padding='same',
                    activation='relu'))
    self.add(Conv2D(256, kernel_size=(3,3), padding='same',
                    activation='relu'))
    self.add(Conv2D(256, kernel_size=(3,3), padding='same',
                    activation='relu'))
    self.add(MaxPooling2D(pool_size=(2,2), strides=(2,2)))

    self.add(Conv2D(512, kernel_size=(3,3), padding='same',
                    activation='relu'))
    self.add(Conv2D(512, kernel_size=(3,3), padding='same',
                    activation='relu'))
    self.add(Conv2D(512, kernel_size=(3,3), padding='same',
                    activation='relu'))
    self.add(Conv2D(512, kernel_size=(3,3), padding='same',
                    activation='relu'))
    self.add(MaxPooling2D(pool_size=(2,2), strides=(2,2)))

    self.add(Conv2D(512, kernel_size=(3,3), padding='same',
                    activation='relu'))
    self.add(Conv2D(512, kernel_size=(3,3), padding='same',
                    activation='relu'))
    self.add(Conv2D(512, kernel_size=(3,3), padding='same',
                    activation='relu'))
    self.add(Conv2D(512, kernel_size=(3,3), padding='same',
                    activation='relu'))
    self.add(MaxPooling2D(pool_size=(2,2), strides=(2,2)))

    self.add(Flatten())
    self.add(Dense(4096, activation='relu'))
    self.add(Dropout(0.5))
    self.add(Dense(4096, activation='relu'))
    self.add(Dropout(0.5))
    self.add(Dense(1000, activation='softmax'))

    self.compile(optimizer=tf.keras.optimizers.Adam(0.003),
                 loss='categorical_crossentropy',
                 metrics=['accuracy'])

### VGG19 모델 출력

model = VGG19(input_shape=(224, 224, 3))
model.summary()

VGG19 모델 출력 결과 일부분


### Git에서 데이터 가져오기

!git clone https://github.com/gilbutITbook/080263.git

데이터 클론 완료


2022.12.29 - [Colab_사용팁] - Colab에서 Kaggle 데이터 바로 사용하기

 

Colab에서 Kaggle 데이터 바로 사용하기

1. 본인 Kaggle 계정에 접속하여 API Token 생성 오른쪽 자신의 계정을 클릭한 후, 'Account'에 접속 이후, 'Create New API Token'을 클릭 후에 로컬에 다운로드 2. Colab에서 본인 API Token 등록 ### kaggle 라이브러

elleik.tistory.com

위에 첨부한 글을 토대로 Kaggle에서 API를 가져와서 사전 훈련된 VGG19 모델을 가져옵니다.
### Colab에서 본인 API Token 등록

!pip install kaggle
from google.colab import files
files.upload()

API Token 등록 완료


### 등록된 API Token 파일 이동

!mkdir -p ~/.kaggle
!cp kaggle.json ~/.kaggle/

https://www.kaggle.com/datasets/keras/vgg19?resource=download&select=vgg19_weights_tf_dim_ordering_tf_kernels.h5 

 

VGG-19

VGG-19 Pre-trained Model for Keras

www.kaggle.com

해당 사이트에서 직접 다운로드를 받고 진행할 수 있습니다.

# 사전 훈련된 VGG19 모델의 가중치 내려받기

!kaggle datasets download -d keras/vgg19

VGG19 모델 다운로드 완료


### .zip 파일 압축 풀기

!unzip /content/vgg19.zip

.zip 파일 압축 풀기 완료
colab에 올라간 파일 최종


### 사전 훈련된 VGG19 가중치 내려받기 및 클래스 정의

model.load_weights("/content/vgg19_weights_tf_dim_ordering_tf_kernels.h5")
classes = {282:'cat',
           681:'notebook, notebook computer',
           970: 'alp'}

### 이미지 호출 및 예측

image1 = cv2.imread("/content/080263/chap6/data/cat.jpg")
image1 = cv2.resize(image1, (224,224))
plt.figure()
plt.imshow(image1)
image1 = image1[np.newaxis, :]
predicted_value = model.predict(image1) # 설명 1
predicted_value = np.argmax(predicted_value)

plt.title(classes[predicted_value])

고양이 사진 예측 결과

참고: 서지영, 『딥러닝 텐서플로 교과서』, 길벗(2022)