스토리
산학 프로젝트로 사전학습된 ViT을 사용하게 되었다. 텐서플로우도 처음... 사전학습 모델도 처음...
어찌저찌 훈련도 시켰고, 성능도 매우 좋았다!
그러나...
모델 로드할 때 문제가 생겼다!
검증 데이터셋 뿐만 아니라 테스트 데이터셋에도 성능이 좋은지 확인하고 싶어서 모델을 로드해야 하는데, 에러 발생...
너무 슬프고 곤란하다.
구글링해도 안 나온다... 하지만 일본어 개발 블로거가 눈에 띄게 되는데, 바로 번역기 돌려보았다!
ViTモデルロード時のエラー(ValueError: Unknown layer: ClassToken)について - よっしーの私的空間
ViT(Vision Transformer)を使用して学習したモデルをロードしようとしたところ、(ValueError: Unknown layer: ClassToken)というエラーが出ました。本記事ではこのエラーに対する対処方法についてまと
book-read-yoshi.hatenablog.com
에러
model = keras.models.load_model('model.h5')
이 코드를 실행하면, 아래와 같은 에러 발생.
Unknown layer: 'ClassToken'.
사전학습 모델을 사용해서 훈련할 때 어떤 옵션을 사용해서 ViT 모델을 사용했는지, 어떤 구조에 ViT 모델을 사용했는지 등...
안 알려줘서 에러가 난 것 같다.
해결
해결책은 매우 간단하다!
내가 어떤 ViT 옵션을 사용했는지, 어떤 구조의 모델을 사용했는지 선언하면 된다.
vit_model = vit.vit_b32(
image_size=224,
activation='softmax',
pretrained=True,
include_top=False,
pretrained_top=False)
model = tf.keras.Sequential([
vit_model,
tf.keras.layers.Flatten(),
tf.keras.layers.BatchNormalization(),
tf.keras.layers.Dense(3, activation='softmax')
], name='vision_transformer')
model .load_weights('model.h5')
시행착오
클래스 토큰을 모른다고 했으니, 내가 설정해주어 보았다...
from vit_keras import layers
model = tf.keras.models.load_model('model.h5',custom_objects={'ClassToken': layers.ClassToken})
그랬더니 이번에는 또 모르는 레이어가 있다고 한다.
Unknown layer: 'AddPositionEmbs'.
나도 모르겠다 싶어서 구글링 하였다...
생각해보니, Pytorch로 테스트 데이터셋에 대해 실험할 때에도 내가 어떤 모델 사용했는지 로드했던 기억이 가물가물 난다... (아니었던가..?)
아무튼 조금 놀랬던 건 일본 블로거와 나의 시행착오가 너무 유사했다...ㅋㅋㅋㅋㅋㅋ 사람 사는 거 다 똑같군요.