-
[HandsOn]11. 심층 신경망 훈련하기 - 내용 정리 2[도서완독]Hands On Machine Learning 2022. 7. 6. 18:39
11.2 사전훈련된 층 재사용하기
전이 학습(transfer learning)
아주 큰 규모의 DNN을 처음부터 새로 훈련하는 것은 힘듬...
비슷한 유형의 문제를 처리한 신경망이 이미 있는지 찾고, 그 신경망의 하위층을 재사용하는 것이 좋다.
훈련 속도, 훈련 데이터의 양 면에서 좋음
이미지, 텍스트 데이터에 주로 쓰인다고 함!
❓그럼 모든 DNN을 짤 때 신경망을 좀 서치하는 게 좋은건가?
❗요즘은 텐서플로 내부에 유명한 모델 구조는 다 패키지로 제공된다고 함. 단, 이미지 텍스트 데이터 한정...😂
❗ 정형 데이터는 적당히 dense 여러개 쌓으면 웬만하면 된다고 하는데...
https://mldlcvmjw.tistory.com/238?category=938422 원본 모델의 출력층 바꾸어야 함.
원본 모델의 상위 은닉층은 하위 은닉층보다 덜 유용함. -> 재사용할 층 개수를 잘 선정하는 것이 필요(작업이 비슷할수록 더 많은 층 재사용)
- 재사용하는 층 모두 동결(훈련되지 않는 가중치로 만들기)
- 모델을 훈련하고 성능을 평가
- 맨 위에 있는 한두개의 은닉층 동결을 해제하고 가중치 조정하여 성능이 향상되는지 확인
- 훈련 데이터가 많을수록 많은층의 동결 해제 가능(재사용 층의 동결을 해제 할 때는 학습률을 줄이는 것이 좋음)
11.2.1 케라스를 사용한 전이 학습
8개의 패션 클래스를 분류하는 모델 A
2개의 패션 클래스를 분류하는 모델 B전이 학습을 이용해 확인해보자!
모델 A를 로드하고 이 모델의 층을 기반으로 새로운 모델 model_B_on_A를 만듬
model_A=keras.models.load_model("my_model_A.h5") model_B_on_A=keras.models.Sequential(model_A.layers[:-1]) #출력층 제외하고 모든 층 재사용 model_B_on_A.add(keras.layers.Dense(1,activation="sigmoid"))
❗모델 A와 모델B_on_A는 일부층 공유! -> 모델B_on_A를 훈련할 때 모델 A도 영향을 받음.
이게 싫다면, 층을 재사용하기 전에 model_A를 클론!
clone_model()로 모델A의 구조를 복제한 후 가중치를 복사(clone_model()메서드는 가중치 복제하지 않음)
model_A_clone=keras.models.clone_model(model_A) model_A_clone.set_weights(model_A.get_weights())
(뭔가 점점 어려움) 새로운 출력층이 랜덤하게 초기화 되어 있으므로, 적어도 처음 몇 에포크 동안은 큰 오차를 만들 수 있음. ▶ 큰 오차 그레이디언트가 재사용된 가중치 망칠 수 있음
▶ 처음 몇 번의 에포크 동안 재사용된 층을 동결하고, 새로운 층에게 적절한 가중치를 학습할 시간을 준다!
모든 층의 trainable 속성을 False로 지정하고 모델을 컴파일
❗층을 동결하거나 해제한 후에는 반드시 모델 컴파일!
for layer in model_B_on_A.layers[:-1]: layer.trainable = False model_B_on_A.compile(loss="binary_crossentropy",optimizer="sgd", metrics=["accuracy"])
몇번의 에포크 동안 모델을 훈련
▶재사용된 층의 동결을 해제
▶모델 다시 컴파일
▶B에 맞게, 재사용된 층을 세밀하게 튜닝하기 위해 훈련 (동결을 해제한 후에 학습률을 낮추는게 좋음)
history=model_B_on_A.fit(X_train_B, y_train_B,epochs=4, validation_data=(X_valid_B,y_valid_B)) for layer in model_B_on_A.layers[:-1]: layer.trainable = True #동결 해제 optimizer=keras.optimizers.SGD(lr=1e-4) #기본 학습률은 1e-2 model_B_on_A.compile(loss="binary_crossentropy",optimizer=optimizer, metrics=["accuracy"]) #다시 컴파일 history=model_B_on_A.fit(X_train_B,y_train_B,epochs=16, validation_data=(X_valid_B,y_valid_B))
❗근데 모델의 테스트 정확도를 믿어선 안된다고 한다! 속임수가 있다고함~!
사실 높은 성능을 가진 모델을 찾기까지 여러 설정을 시도했는데 교재에서 안 밝힌것임.
타깃 클래스나 랜덤 초기값을 바꾸면 성능이 떨어질것이다.....
현란한 새 기술이 도움이 안될때가 많음....
왜 그랬을까? 전이 학습은 작은 완전연결 네트워크에서는 잘 동작하지 않음
작은 네트워크: 패턴수를 작게 학습, 완전 연결 네트워크: 특정 패턴을 학습
이런 패턴은 다른 작업에 유용하지 않다!
전이 학습은 일반적인 특성을 감지하는 경향이 있는 심층 합성곱 신경망에서 잘 동작함.
14장에서 전이 학습을 다시 살펴보자!
'[도서완독]Hands On Machine Learning' 카테고리의 다른 글
[HandsOn]12. 텐서플로를 사용한 사용자 정의 모델과 훈련 - 내용 정리 1 (0) 2022.07.19 [HandsOn]11. 심층 신경망 훈련하기 - 내용 정리 3 (0) 2022.07.08 [HandsOn]11. 심층 신경망 훈련하기 - 내용 정리 1 (0) 2022.07.05 [HandsOn]10. 케라스를 사용한 인공 신경망 - 내용 정리 3 (0) 2022.07.01 [HandsOn]10. 케라스를 사용한 인공 신경망 - 내용 정리2 (0) 2022.07.01