스토리

산학 프로젝트로 사전학습된 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로 테스트 데이터셋에 대해 실험할 때에도 내가 어떤 모델 사용했는지 로드했던 기억이 가물가물 난다... (아니었던가..?)

아무튼 조금 놀랬던 건 일본 블로거와 나의 시행착오가 너무 유사했다...ㅋㅋㅋㅋㅋㅋ 사람 사는 거 다 똑같군요.

+ Recent posts