여정의 기록

Deep Residual Learning for Image Recognition 공부 본문

공부/프로젝트 진행

Deep Residual Learning for Image Recognition 공부

Chelsey 2022. 7. 29. 16:27
728x90

https://arxiv.org/abs/1512.03385. : 해당 논문 주소입니다!

음식 인식 프로젝트를 진행할 때 보았던 논문 공부한 내용을 블로그에 업로드합니다.

당시 해당 논문을 읽고 구글에서 서치한 문서 - 혹은 유튜브를 참고하여 작성하였습니다.

https://www.youtube.com/watch?v=671BsKl8d0E&t=1131s. : 참고한 유튜브 링크


 

The deeper network has higher training error, and thus test error.

우선 해당 논문에서는 깊이가 깊어질수록 plain의 경우 error가 높아진다고 한다.

 

layer가 깊어질 수록 error가 줄어들어야한다는 생각이 들 수 있는데 우리가 실제로 경험해본 결과는 error가 높아진다. 

overfitting가 일어날 수 있다. (작은 데이터에 너무 많은 레이어를 넣게되면 overfitting이 나타나기도 한다)

H(x)를 directly로 학습하기보다 F(x) : = H(x) - x 로 F(x)+x 로 처리해서 출력값을 x를 더해주는 것으로 끝난다. 추가적인 파라미터가 필요하지 않게된다. 복잡도가 증가하지도 않는다. 

 

residual functions 를 항상 사용하고 identity mapping은 매번 사용해 더해진다.

 

동일한 F(x)를 처리하기 때문에 이전 레이어 값인 x를 보존하고 추가학습이 되기 때문에 학습하기 더 쉽다. → residual fucntion

 

VGG nets의 경우 적당히 따름 3*3 따름, 같은 갯수의 필터사용, feature map size가 절반이 되면 필터 갯수가 두배로 늘려서

residual 의 경우 conv 필터를 2개씩 묶어서 매번 residual fucntion 형태로 학습 진행하도록 함. 점선의 경우 입력단과 출력단의 dimension이 맞지않아 크기를 바꿔준다.

 

입력단과 출력단의 dimensions가 같다면 identiity mapping사용 가능,

그렇지 않다면 padded 한 다음 identity mapping 사용가능 혹은 projection 연산활용한 shortcut connection 이용해 구현하는 방법.

 

resnet 의 경우 매 convolution layer 거칠 때 마다 배치 정규화를 이용, 

learning rate 도 학습 중 점진적으로 줄어갈 수 있도록 함

 

vanishing gradients 때문에 문제 발생 x

forward backward path 에서 signals 값들이 사라지는 문제 없다

exponentially low convergence rates 때문에 문제가 생긴 것 같다

초기단계에서 더 빨리 수렴하도록 만들어주어 optimization을 더 쉽게 만들어준다.

(F(x)가 0으로 수렴하면 계산이 더 쉬워지므로 더 빨리 수렴한다고 표현한 것 같다)

 

shortcut connection을 위해서 identity mapping을 사용할지? projection을 사용할지?

  1. zero-padding을 이용하여 dimensions을 increasing해주고 identity mapping을 사용
  2. dimensions를 increasing할 때만 projection 을 사용
  3. 모든 shortcuts에 대하여 projection을 사용

c가 가장 성능이 좋다는 결과

projection이 필수일정도로 높은 성능은 아니다. 기본적으로 identity 로 성능을 충분히 높일 수 있다.

bottle neck design 에서는 identity mapping이 좋을 수 있다.

 

resnet결과, 성능은 더 좋아졌지만 VGG-16 에 비하면 복잡도는 낮아졌다.

 

 

resnet은 일반적으로 이미지에 대하여 Resize, CenterCrop, ToTensor() 와 입력 데이터 정규화를 사용하는 모델이다.

transforms 객체를 이용하여 전처리 정의

 

 


아래는 음식 인식 프로젝트 당시 코드와 함께 공부한 것입니다.


전이학습

전이 학습은 훨씬 더 많은 데이터에 대해 학습 된 기존 모델을 가져와 해당 데이터에서 모델이 학습한 기능을 사용하여 문제에 사용하는 딥 러닝의 개념

모델의 모든 계층을 훈련하는 대신 전이 학습에서 일부 계층을 잠그고 잠긴 계층에서 훈련된 가중치를 사용하여 데이터에서 특정 특징을 추출, 하위 레이어에서 일부를 재교육하기 위해 선택할 수 있는 모든 레이어를 안 잠궈도됨

 

VGG16의 Keras에서 구현된 전이 학습(transfer learning)

VGG모델을 이용한 새로운 이미지 분류

VGG16 → 16-layer, VGG19 → 19-layer version 제공

 

데이터 준비

image=img_to_array(image)
image=image.reshape(1,image.shape[0], image.shape[1], image.shape[2])

모델 생성- 사전 훈련된 가중치 불러오기

from keras.applications.vgg16 import VGG16

model = VGG16()
# model = VGG16(weights='imagenet', include_top=True)
# VGG16보다 resnet이 더 성능이 좋다.
import keras,os
from keras.models import Sequential
from keras.layers import Dense, Conv2D, MaxPool2D , Flatten
from keras.preprocessing.image import ImageDataGenerator
import numpy as np

trdata = ImageDataGenerator()
traindata = trdata.flow_from_directory(directory="data",target_size=(224,224))
tsdata = ImageDataGenerator()
testdata = tsdata.flow_from_directory(directory="test", target_size=(224,224))

https://towardsdatascience.com/step-by-step-vgg16-implementation-in-keras-for-beginners-a833c686ae6c

모델 구조 확인

model.summary()
image=preprocess_input(image)

yhat=model.predict(image)
label=decode_predictions(yhat)
label=label[0][0]

EarlyStopping

from keras.callbacks import ModelCheckpoint, EarlyStopping

checkpoint = ModelCheckpoint("vgg16_1.h5", 
monitor='val_acc', verbose=1, save_best_only=True, 
save_weights_only=False, mode='auto', period=1)

early = EarlyStopping(monitor='val_acc', 
min_delta=0, patience=40, verbose=1, mode='auto')

model.fit_generator(generator= traindata, steps_per_epoch= 2, 
epochs= 100, validation_data= testdata, validation_steps=1, 
callbacks=[checkpoint,early])

model.save_weights("vgg16_1.h5")

 

epoch 5정도로 해볼 것

 

 

ResNet

레이어가 깊다고 마냥 좋진 않다.

Residual Block : shortcut이 존재한다.

기존 신경망 : x로 y를 매핑하는 함수 H(x) 를 얻는 것이 목적

ResNet : F(x) + x 를 최소화 하는 것이 목적 ,

x는 변경 불가이므로 F(x)를 0에 가깝게 만드는 것이 목적

→ F(x) == 0 이 되면, input and output이 모두 x로 같아지게 된다.

→ F(x)=H(x) - x 이므로 → F(x)를 최소 == H(x) -x 를 최소

(H(x) - x : 를 잔차residual 라고 한다, 잔차를 최소)

VGG-19의 구조를 뼈대로 + convoulution layer를 add하여 깊게 만든 후 → shortcut add.

깊은 구조일 수록 좋다. (shortcut을 연결하여)

 

728x90