SW/영상인식

영상인식 : Keras : Resnet 개념, 사용법

얇은생각 2019. 11. 26. 07:30
반응형

Residual 네트워크의 약자인 ResNet은 많은 컴퓨터 비전 작업의 중추로 사용되는 클래식 신경망입니다. 이 모델은 2015 년 ImageNet 챌린지에서 우승했습니다. ResNet의 근본적인 혁신은 150개 이상의 레이어로 매우 깊은 신경망을 성공적으로 훈련 할 수 있다는 것입니다. ResNet 이전에는 그라디언트 소실 문제로 인해 딥 뉴럴 네트워크의 학습은 매우 어려웠습니다.

ImageNet 2012의 우승자이자 딥 러닝에 초점을 맞추기 시작한 모델인 AlexNet은 8개의 컨볼루션 레이어, VGG 네트워크는 19 개, Inception 또는 GoogleNet은 22 개 레이어, ResNet 152는 152 개 레이어로 구성되었습니다.

그러나 단순히 계층을 함께 쌓아 네트워크 깊이를 늘리는 것은 효과가 없습니다. 그라디언트가 이전 레이어로 다시 전파되므로 반복되는 곱셈은 그라디언트를 매우 작게 만들 수 있습니다. 결과적으로 네트워크가 깊어 질수록 성능이 포화되거나 빠르게 저하되기 시작합니다.

 

 

연결 건너 뛰기 기법

 

ResNet은 먼저 연결 건너 뛰기 개념을 도입했습니다. 아래 다이어그램은 스킵 연결을 보여줍니다. 그림은 컨벌루션 레이어를 차례로 쌓아 올리는 것입니다. 오른쪽에 여전히 전과 같이 컨볼루션 레이어를 쌓아 올리지만 이제 컨볼루션 블록의 출력에 원래 입력을 추가합니다. 이것을 연결 건너 뛰기라고합니다.

 

X_shortcut = X # Store the initial value of X in a variable
## Perform convolution + batch norm operations on X
X = Add()([X, X_shortcut]) # SKIP Connection

 

코딩은 매우 간단하지만 한 가지 중요한 고려 사항이 있습니다. 위의 X, X_shortcut은 두 개의 행렬이므로 동일한 모양을 가진 경우에만 추가 할 수 있습니다. 따라서 컨볼루션 + 배치 규범 연산이 출력 모양이 동일한 방식으로 수행되면 아래 표시된 것처럼 간단히 추가 할 수 있습니다.

 

 

x와 x_shortcut이 같은 모양일 때 

 

그렇지 않으면 x_shortcut은 선택된 컨볼 루션 레이어를 통과하여 출력이 아래에 표시된 것처럼 컨볼 루션 블록의 출력과 동일한 차원이되도록합니다.

 

 

X_shortcut은 컨볼루션 블록을 통과

 

이러한 기능은 Keras를 사용하여 ReLU 활성화로 Convolution 및 Batch Norm 레이어를 구현합니다. 여기에서 주목해야 할 한 가지 중요한 점은 위의 그림과 같이 스킵 연결이 RELU 활성화 전에 적용된다는 점이다. 연구 결과에 따르면 최상의 결과를 얻을 수 있습니다.

 

 

연결 건너 뛰기가 작동하는 이유는 무엇입니까?

이것은 흥미로운 질문입니다. 연결 건너 뛰기가 작동하는 이유는 두 가지입니다.

1. 그라디언트가 통과 할 수 있는 이 대체 바로 가기 경로를 허용함으로써 그라디언트 소실 문제를 완화합니다.

2. 모델이 더 높은 계층이 적어도 하위 계층만큼 성능이 우수하고 더 나쁘지 않은 성능을 보장하는 항등 함수를 학습하게합니다

실제로 ResNet 건너 뛰기 연결은 FCN (Fully Convolutional Network) 및 U-Net과 같은 훨씬 더 많은 모델 아키텍처에서 사용됩니다. 모델의 이전 계층에서 이후 계층으로 정보를 전달하는 데 사용됩니다. 이러한 구조에서 업 샘플링 레이어로 다운 샘플링 층에서 정보를 전달하는 데 사용됩니다.

 

 

Keras 사전 훈련 모델

Keras를 사용하여 미리 훈련 된 ResNet-50을 로드하는 모델을 Github에 업로드해주었습니다. 한 줄 코드로 모델을 로드 할 수 있습니다.

 

base_model = applications.resnet50.ResNet50(weights= None, include_top=False, input_shape= (img_height,img_width,3))

 

코딩 된 ResNet-50에서와 같이 임의의 가중치로 모델을 초기화하고 싶기 때문에 weights = None입니다. 그렇지 않으면 사전 훈련된 ImageNet 가중치를 로드 할 수도 있습니다. 원본 모델에 최종 풀링 및 완전히 연결된 레이어를 포함하지 않도록 include_top = False를 설정했습니다. ResNet-50 모델에 Global Average Pooling과 조밀한 출력 레이아웃을 추가했습니다.

 

x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dropout(0.7)(x)
predictions = Dense(num_classes, activation= 'softmax')(x)
model = Model(inputs = base_model.input, outputs = predictions)

 

위에 표시된 것처럼 Keras는 사전 훈련 된 모델을로드 할 수있는 매우 편리한 인터페이스를 제공하지만 개념을 이해하고이 학습 내용을 다른 새로운 아키텍처에 적용 할 수 있도록 ResNet을 한 번 이상 직접 코딩하는 것이 중요합니다.

Keras ResNet은 Adam 옵티 마이저와 학습 속도 0.0001로 100번 훈련 한 후 75 %의 정확도를 얻었습니다. 정확도는 자체 코딩된 모델보다 약간 낮으며 이는 가중치 초기화와 관련이 있다고 생각합니다. Keras는 또한 데이터 기능 보강을 위한 간편한 인터페이스를 제공하므로 기회가 된다면 이 데이터 세트를 기능 보강하여 성능이 향상되는지 확인하십시오.

 

 

결론

ResNet은 많은 컴퓨터 비전 작업에서 매우 자주 사용되는 강력한 백본 모델입니다. ResNet은 연결 건너 뛰기를 사용하여 이전 레이어의 출력을 이후 레이어에 추가합니다. 이것은 사라지는 그라디언트 문제를 완화하는 데 도움이됩니다. pretrained ResNet (50)를 로드하거나 ResNet 공유 코드를 사용하는 Keras를 사용할 수 있습니다.

반응형