ML/Articles

Transfer Learning in Keras Using Inception V3

a292run 2021. 2. 24. 11:05
반응형

원본 링크



Transfer Learning in Keras Using Inception V3

머신러닝 연구자는 결과를 공유하기를 원한다. 그들은 신경망 구조를 만들고 모델을 훈련하는데 많은 시간이 걸릴 수 있다. 모델을 훈련하기 위해 몇일 또는 몇주가 걸릴 수 있다. 또한 GPU와 병렬 시스템같은 고비용 하드웨어에서 학습 절차를 실행할 수 있다. 그러나, 사전 구성된 네트워크 구조와 사전훈련된 가중치가 있다면 몇초안에 동일한 모델을 실행할 수 있다. 이런방법으로 학습 결과는 다른 그룹간에 전달(전이)된다. 게다가 학습결과가 전이되면 대규모 훈련 데이터셋이 필요없다.

Vlog

다음 비디오는 전이학습(transfer learning)에 대해 다룬다.




Matrix

매트릭스에서 I know kung fu 장면은 전이학습을 언급하는 은유이다.


Matrix

Image Recognition

이전에 체스 승자 알고리즘을 개발하는 것이 AI 연구에서 가장 긴장감 넘치는 도전으로 여겨졌다. 그 이후에 체스를 두는 것보다 이미지를 분류하는 것이 더 긴장감 넘치는 도전이라는 것을 알았다.

이전에 전통적인 컴퓨터 비전 알고리즘은 이미지를 인식하기 위해 적용되었다. 예를 들면, 아래 그림은 시간별 이미지넷(ImageNet) 결과를 나타난다. 이미지넷은 1000개의 다른 분류로 12000개의 이미지로 구성된다.


ImageNet Results Timeline

전통적인 컴퓨터 비전으로는 거의 30% 오류율에서 막혔었다. 이 분야에 딥러닝을 적용하여 역사의 방향이 바뀐다. 오류율은 순식간에 15%로 뛰어올랐다. 2012년에 나타나는 오랜지색 점은 알렉스넷(AlexNet)을 나타낸다.



ImageNet Winner Models


Imagenet winner models

알렉스넷은 역사의 방향을 바꾸지만 오늘날 우리는 좀 더 나아갔다. Inception V3 모델은 2014년에 거의 3%의 오류율을 달성한다. 이러한 일반적인 이미지넷 모델은 keras에서 지원한다. 우리는 단지 몇줄의 코드로 학습 결과를 전이할 수 있다.



Inception V3

Inception V3는 CNN의 종류로 많은 합성곱(convolutional) 레이어와 max pooling 레이어로 구성된다. 마지막에 Fully Connected Neural Network를 포함한다. 그러나, 여러분은 외워서 이 구조를 알 필요가 없다. 게라스가 이것을 다룰 것이다.


Inception V3 model structure

아래 코드로 Inception V3를 임포트한다.


from keras.applications.inception_v3 import InceptionV3
from keras.applications.inception_v3 import preprocess_input
from keras.applications.inception_v3 import decode_predictions

또한 몇가지 전처리 단계를 구현하기 위해 다음 라이브러리가 필요하다.


from keras.preprocessing import image
import numpy as np
import matplotlib.pyplot as plt



Constructing Inception

Inception V3 모델을 구성하는 것은 쉽다. 가중치는 처음에 모델 구성 명령을 실행할 때 자동적으로 설치될 것이다. imagenet으로 가중치 파라미터를 지정하는 것은 이미지넷 대회를 위해 사전 훈련된 가중치를 사용하는 것을 제공한다. 이 파라미터를 none으로 정의하면 임의의 가중치를 초기화한다.


model = InceptionV3(weights='imagenet', include_top=True)

모델이 로드되면 사전 구성된 구조와 사전 훈련된 가중치를 볼 수 있다.


print("model structure: ", model.summary())
print("model weights: ", model.get_weights())

이제, 이미지넷에서 우승한 모델에 대한 사전 구성된 구조와 사전 훈련된 가중치가 있다. Inception V3에 어떤 것이든 물어볼 수 있다. 폴더내 한묶음의 이미지를 전달해 본다. 증가하는 인덱스가 이미지의 이름이다. 이미지는 구글에서 임의로 찾은 것이다.


Testset consists of randomly found cat and dog images

각 이미지에서 가장 가능성있는 3개의 후보를 물어본다. 그러면 이미지를 표시와 이것의 예측을 함께 표시한다.


for i in range(1, 17):
    img_path = 'testset/%s.jpg' % (i)

    img = image.load_img(img_path, target_size=(299, 299))
    x = image.img_to_array(img)
    x = np.expand_dims(x, axis = 0)
    x = preprocess_input(x)

    features = model.predict(x)
    print(decode_predictions(features, top = 3))

    plt.imshow(image.load_img(img_path))
    plt.show()

Inception V3 결과는 만족스럽다. 개인적인 관찰을 바탕으로 Inception V3는 동물 종류를 인식하는데 훌륭하지만 순종을 인식하는 것에서는 실패할 것이다. 예를 들면, 'british shorthair'를 예측하기 위해 모델에 요청하면 모델은 'persian cat'을 예측한다.


Sample output for InceptionV3

개와 고양이 이미지를 인식하기 위해 이미지넷 우승 모델 Inception V3에 대한 학습 결과를 전이했다. 비록 모델이 1000개의 다른 범주에 대한 12,000개의 이미지에 대해 훈련되었지만 몇초만에 이를 사용하여 동일한 결과를 낼 수 있다. Andrew 교수는 전이학습은 ML 성공의 다음 동력이 될 것이다라고 이야기했다.



Customization

매트릭스에서 네오에게 쿵푸 지식이 전이되었지만 그는 매트릭스에 접속하여 모피어스와 훈련했다. 전이학습에서도 이렇게 할 수 있다.


Training in matrix

우리는 이미 VGG나 Inception같은 발전된 심층 신경망은 중간 및 고 레벨 특성에서 얼굴 속성을 학습했다는 것을 안다.


Mid and high level features in a deep neural networks

그러나, 이들 모델은 연구자가 보유한 강력한 computation power(CPU, GPU and TPU)로 백만 수준의 데이터로 이를 학습할 수 있다. 우리는 이런 크기의 데이터도 computation power도 거의 가지고 있지 않다.

여전히 우리는 이러한 사전 훈련된 모델을 사용하여 작은 데이터셋으로 훈련할 수 있다. 그 기술은 여기서 앞선 레이어를 freeze or lock하고 최종 레이어가 훈련되게 하는 것이다. 이러한 방식으로 새로운 모델은 중간 및 고레벨 특성에서 얼굴 패턴을 알 수 있다.


Keymaker in Matrix

Apparent Age and Gender Prediction in Keras에서 전이학습에서의 맞춤화(customization)에 대한 연구를 찾을 수 있다. 이 글은 작은 노력으로 일반적인 VGG 모델을 나이와 성별 예측 모델로 수정하는 것을 포함한다. 결과도 만족스러우며 아래 비디오에서 볼 수 있다.




Training from scratch

만약 수백만의 데이터가 있고 처음부터 모델을 훈련한다면 즉, 앞선 레이어 가중치를 고정하지 (freeze) 않는다면, 모델은 좀 더 성공적일 것이다. 우리가 적용한 접근 방법은 단지 실용적일 뿐 최고는 아니다.


Transfer learning vs supervised learning



Conclusion

전이학습에 대한 다른 접극법과 이것의 장단점을 알아보았다. 전이학습은 기본적으로 여러분이 영웅이 되지 않는 것을 제안한다. 사전 훈련된 모델은 여러분에게 가장 빠른 해결방법을 제공한다.

이 글에서 사용한 소스코드는 여기에서 찾을 수 있다.

반응형