전이 학습

박재형·2025년 5월 23일
0

오늘은 전이 학습에 대해 학습해보겠다.
전이 학습이란 기존에 학습된 모델의 지식을 새로운 곳에 적용하는 기법이다. 이 전이 학습에는 두가지 방법이 있는데, 첫번째로는 기존에 학습된 모델을 통째로 쓰는 것이다. 두번째는 모델의 일부 레이어만 떼와서 사용하는 것이다. 이번 시간에는 모델의 일부를 떼와서 내 코드에 적용시키는 방법에 대해 학습해 볼 것이다.

일단 Inception V3이라는 Google이 개발한 모델을 다운받아 주겠다. 이 모델은 이미지넷 챌린지에서 좋은 성능을 보였고, 이미 대규모의 이미지 데이터를 통한 학습을 완료하였기에 빠르고 정확한 분류가 가능하다.

다운 받은 뒤, 우리가 제작하려는 모델 위에

from tensorflow.keras.applications.inception_v3 import InceptionV3
inception_model = InceptionV3(input_shape=(150, 150, 3), include_top=False, weights=None)
inception_model.load_weights('인셉션v3(파일 이름)')

이렇게 적어주었다. 모델이 받는 인풋 이미지의 크기를 설정하고, 최상단 레이어를 제거하고, 원래 학습되어있던 가중치를 받지 않기로 했다.

각각 이유는, inception v3은 299, 299, 3의 이미지로 학습되었지만, 전이 학습에서는 원하는 크기로 조정할 수 있기에 150, 150, 3의 이미지를 학습하도록 이렇게 설정했고, 마지막에 우리가 원하는 새 분류 레이어를 직접 추가할 수 있도록 false로 설정했으며 inception v3모델을 직접 다운 받았기에 None으로 설정했다.

저번 시간에 학습했던 걸 이용해서 inception v3모델을 시각화 해보면,
이런 식으로 상당히 길고 복잡한 레이어를 가지고 있음을 알 수 있다.

그리고 우린 가중치를 가져왔으므로 학습을 하면서 건들면 안되기에, 학습 금지 레이어를 설정해주어야 한다.

for i in inception_model.layers:
  i.trainable = False

이렇게 코드를 작성해주면 모든 레이어가 가중치를 학습하지 않게 된다.

이제 예전에 만들었던 고양이 개 구분 모델을 이 inception v3을 전이 학습하여 컴파일 해보겠다.

일단, functional api를 이용해서 레이어를 작성하겠다.

마지막레이어 = inception_model.get_layer('mixed7')
layer1 = tf.keras.layers.Flatten()(마지막레이어.output)
layer2 = tf.keras.layers.Dense(1024,activation='relu')(layer1)
drop1= tf.keras.layers.Dropout(0.2)(layer2)
layer3 = tf.keras.layers.Dense(1,activation = 'sigmoid')(drop1)
model = tf.keras.Model(inputs=inception_model.input, outputs=layer3)

(inception v3의 마지막 레이어는 mixed7이라는 이름을 가지고 있다)

이런 식으로 나만의 레이어를 작성해주었는데, 개와 고양이 둘 중 하나를 구분하는 모델이므로 마지막 output은 1, 활성화 함수는 시그모이드를 사용했다.

inception v3 모델이 학습이 잘 되어 있는 모델이지만 우리가 작성한 레이어에서 학습이 일어나면 더 좋을 것 같으므로 위에 작성했던 코드를 조금 수정하여

for i in inception_model.layers:
  i.trainable = False
unfreeze = False
for i in inception_model.layers:
    if 'mixed7' in i.name:
        unfreeze = True
    if unfreeze:
        i.trainable = True

이렇게 바꿔주었다. mixed7 레이어에 진입하면 w값 학습이 다시 시작되게 된다.

이제 inception v3 모델과 내가 작성한 레이어를 연결 했으므로 컴파일 해보면,

model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.00001), loss='binary_crossentropy', metrics=['accuracy'])
model.fit(train_ds,validation_data=val_ds, epochs=3)

(learning rate를 매우 작게 지정했다.)


3번의 epochs만 돌렸음에도 불구하고 97%라는 엄청나게 높은 정확도를 가진 모델이 탄생했다.

이렇게 검증된 모델을 비슷한 과제에 전이 학습으로 적용해서 사용하면 매우 좋은 정확도를 가진 모델을 단기간에 쉽게 만들 수 있다.

0개의 댓글