관리 메뉴

클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지

합성곱 신경망 5 - 복잡한 모델 생성 2 : 전이 학습 본문

인공지능/딥러닝

합성곱 신경망 5 - 복잡한 모델 생성 2 : 전이 학습

huenuri 2024. 10. 29. 06:42

이번에는 전이 학습에 대해서 학습해 보겠다. 앞서 훈련한 모델의 일부를 가져와서 그대로 사용하고, 최종 출력층만 새롭게 추가하여 모델을 재구성할 수 있다. 이처럼 기존에 학습된 모델을 활용해 새로운 모델을 만들어 내는 개념을 Transfer learning이라고 한다.

 


 

 

 

앞에서 학습한 모델에서 입력 레이어부터 'flatten_layer'라는 name 속성을 갖는 Flatten 층까지 해당하는 부분을 따로 추출하여, base_model 객체를 만든다. 모델 개요를 출력해서 확인해 보면 (28, 28, 1) 이미지를 받아서 5408개의 피처로 특징을 추출해 출력하는 모델이다.

 

 

 

모델 구조를 기각화하면 더 쉽게 이해할 수 있다.

 

 

 

Sequential API를 사용하여 앞에서 정의한 base_model을 레이어로 추가하고, 최종 분류기 역할을 하는 Dense 레이어를 새롭게 이어서 추가해 준다. 총 파라미터 개수는 54410개이고 모두 훈련이 가능하다고 표시되어 있다.

훈련이 가능다하는 뜻은 모델 훈련 시 파라미터 값이 업데이트된다.

 

이 코드도 책에서와는 많이 다른 코드이다. 수십 번을 시도했던 것 같다. 계속해서 오류가 발생하는 이유는 base_model의 출력이 digit_model에 연결되었을 때 형상이 명확하지 않기 때문이다. 이를 해결하기 위해, base_model의 출력 형상을 확실히 지정한 후 digit_model에 연결하는 방법을 시도해 보았다.

  1. base_model을 통해 출력되는 형상을 먼저 확인한다.
  2. 그런 다음 tf.keras.Input을 사용하여 입력 형상을 명시적으로 정의한다.

 

 

 

이런 식으로 명시적으로 정의한 후에 실행하자 이번에는 잘 출력이 되었다. 이제 모델의 구조를 출력해 보겠다. 최종적으로 노드 10개를 가진 분류기 역할을 하는 Dense 레이어가 추가될 것을 확인할 수 있다.

 

 

 

모델을 컴파일하고 훈련하면 약 99%의 정확도를 보인다.

 

 

 

모델 인스턴스는 trainable 속성을 갖고 있다. 이 속성을 False로 지정하면 모델의 파라미터 값이 고정되어 훈련을 통해서 업데이트되지 않는다. 이런 방식으로 base_model_frozen을 구성한다. 훈련한 파라미터 개수가 0으로 확인된다.

 

 

 

이번에는 파라미터를 고정한 base_model_input 모델과 새로운 분류기 역하을 하는 Dense 레이어를 Functional API를 적용하여 구성해 본다. Sequential API로 구성하는 방식의 차이점에 유의해보자.

총 파라미터 개수는 54410개이고, 앞서 고정한 320개의 파라미터는 훈련이 불가능하다고 표시되어 있다.

 

 

 

모델을 컴파일하고 훈련해 보겠다.

 

 

 

모델 전체가 아니라 특정 레이어를 지정하여 파라미터가 업데이트되지 않도록 고정하는 방법도 가능하다. 다음은 Conv2D 레이어를 취소하고 trainable 속성을 False로 지정하는 예시다.

 

 

 

 

앞서 고정한 모델에 새로운 분류기 역할을 하는 Dense 레이어를 연결하여 모델을 구성한다.

 

 

모델을 컴파일하고 훈련시킨다. 다양한 모델 구성 방법과 파라미터 조정 방법에 대해서 이해하는 것이 중요하다.


 

 

학습을 마치고

 

적어도 6시 반까지는 이 단원을 마치고 싶었는데 거의 목표를 달성해서 기뻤다. 전이학습에서는 여러 종류의 모델 구성 방법과 파라미터를 조정하는 방법에 대해 배울 수 있었다.

책과 달라서 수정해야 하는 코드가 많지만 그러면서 더 많은 것들을 배울 수 있어서 감사했다.