[딥러닝] VGG Net - 논문리뷰 -Very Deep Convolutional Networks for large-scale image recognition
논문 링크
↓↓↓↓↓↓
https://arxiv.org/pdf/1409.1556.pd
VGG net은 유명한 레이어이자 실무에서도 많이 쓰이는 모델이라고한다.
세계 이미지 분류 대회가 있다.
거기서 2014년에 준우승을 한 모델.
살짝 여담으로
인공지능을 활용한 대회는 사람의 성능을 뛰어넘으면 종료되는데
2017년에 종료됐다니..조금 무섭다.
이제 이미지 분류는 기계가 사람보다 더 잘한다는 그런걸까..ㅎ

먼저 총 6개의 구조를 볼 수 있다.
구조도를 보면
마지막 FC-1000인것을 보아
Dense(1000, 'softmax')이므로 1000개의 카테고리를 분류하는 문제임을 알 수 있다.
input layer층에
conv3는 (3*3)필터를 쓰라는 의미이다.
Conv2D(64,(3,3))
모든 필터의 사이즈가 3인것을 볼 수 있는데
레이어를 깊게 쌓을 때에는 3*3필터의 성능이 제일 좋다.
필터를 거칠 수록 이미지의 크기는 줄어들 수 밖에 없다.
따라서 필터 사이즈가 크면 이미지가 줄어드는 것이 빨라지기 때문에
VGG 이후로 3*3 필터를 사용하는 모델들이 많아졌다고 한다.
input_shape는 RGB이니 채널을 3으로 넣어준다.
input_shape = (224,224,3)
위에부터 차근히 보면
Conv -> maxpool -> Conv -> maxpool ... 이런식으로 레이어가
쌓여있는 것을 볼 수 있다.
위 구조도대로 D모델을 쌓아본다면
model = Sequential() model.add(Conv2D(input_shape=(224,224,3),filters=64,kernel_size=(3,3),padding="same", activation="relu")) model.add(Conv2D(filters=64,kernel_size=(3,3),padding="same", activation="relu")) model.add(MaxPool2D(pool_size=(2,2),strides=(2,2))) model.add(Conv2D(filters=128, kernel_size=(3,3), padding="same", activation="relu")) model.add(Conv2D(filters=128, kernel_size=(3,3), padding="same", activation="relu")) model.add(MaxPool2D(pool_size=(2,2),strides=(2,2))) model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu")) model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu")) model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu")) model.add(MaxPool2D(pool_size=(2,2),strides=(2,2))) model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu")) model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu")) model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu")) model.add(MaxPool2D(pool_size=(2,2),strides=(2,2))) model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu")) model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu")) model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu")) model.add(MaxPool2D(pool_size=(2,2),strides=(2,2))) model.add(Flatten()) model.add(Dense(units=4096,activation="relu")) model.add(Dense(units=4096,activation="relu")) model.add(Dense(units=2, activation="softmax"))
후..대충..이렇게..
이게 맞는 것인가..
틀려도 괜찮다
왜냐하면
tensorflow에서는 간단한 모듈로 VGG16을 가져올 수 있다.
VGG16모델이 무엇이냐하면
실무에서는 D,E 모델이 자주 쓰인다고 한다.
많이 쓰이기 때문에
별칭이 붙어있는데,
D = VGG16
E = VGG19
라고 불린다.
E(VGG19)를 보면
19 weight인 것을 볼 수 있다.
밑에 쌓인 레이어의 갯수가 19개이므로
weight layer가 19개가 있는 레이어인 것을 알 수 있다.
참고로 , maxpooling의 경우에는 가중치가 없는 레이어이기 때문에
weight레이어로 카운트 되지 않는다.
그래서 총 19개의 weight이고 이름이 VGG19인것같다.
D(VGG16)도 마찬가지로 16개의 weight가 있다.
from tensorflow.keras.applications import VGG16 transfer_model = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3)) transfer_model.trainable=False
아무튼 tensorflow에서 모델을 가져올 수 있다.
보통 저 모델을 다 가져와서 쓰지 않으니, None으로 레이어 구조만 가져와준다.
trainable = False로 주는데
이걸 가중치를 얼린다라고 표현한다고 한다.
학습이 진행되면서 가중치가 업데이트 되는데
이 가중치가 우리 데이터셋을 망가지게하기 때문에
학습이 일어지 않도록 얼려라. 이런 뜻.
모델 안에 위에서 할당시킨 transfer_model을 넣어주고
밑 레이어부터는 내 데이터에 맞게 모델을 튜닝해주면된다.
model = Sequential([ transfer_model, Flatten(), #여기서는 우리에 맞게 튜닝. Dropout(0.5), Dense(512, activation='relu'), Dense(128, activation='relu'), Dense(2, activation='softmax'), ])
이렇게 간단한 사용을 할 수 있다니
세상이 좋아졌다.
얼레벌레 마무리하기
A부터 E모델의 성능표를 보면 성능이 쭉 올라가다가
D와 E를 기점으로 성능이 떨어지는 것을 볼 수 있다.
딥러닝 모델이라고 레이어를 깊게 쌓는것이 중요한 것이 아니라
어느 수준을 넘어서면 성능이 떨어진다는 것을 알 수 있다.
D, E의 모델의 성능은 거의 비슷하지만
실무에서는 D를 더 많이 사용한다고 한다.
왜냐하면
레이어의 수가 E보다 3개 더 적기 때문에
학습해야할 파라미터의 갯수가 훨씬 적어진다.
그래서 학습 속도가 더 빠르다.
파라미터 얘기가 나와서 생각이 났는데
이 모델의 단점은 파라미터수가 많은 것이라고 한다.
처음쓰는 논문리뷰?인데
논문 자체를 하나하나 해석하는 식으로 옮겨적은 것이 아니라서
이렇게 쓰는게 맞는건가 싶지만
내 블로그니깐
그냥 내가 이해한대로 쓰는거지 뭐~ㅎ
솔직히,, 그대로 한국어로 옮겨적으면
그게 논문 리뷰인가,,
번역이지.
'Artificial Intelligence > Deep Learning' 카테고리의 다른 글
[딥러닝] Activation Function 활성함수 한번에 이해하기(Sigmoid, Softmax, Relu) (6) | 2022.02.18 |
---|---|
[딥러닝] Convolution Neural Network (CNN) 합성곱 신경망 - 간단하고 쉽게 이해하기 (12) | 2022.02.17 |
[딥러닝] Dense Layer (Fully Connected Layer) 이해하기 (0) | 2022.02.09 |
[딥러닝] classification neural network(분류신경망) (0) | 2022.01.24 |
[딥러닝] batch size(배치사이즈) VS epoch(에포크) VS iteration(반복) (0) | 2022.01.22 |
댓글