시작은 미약하였으나 , 그 끝은 창대하리라

[Pytorch, Huggingface] Pretrained Model 의 특정 Layer 만 Freeze 하기 본문

인공지능/딥러닝 및 파이토치 기타 정리

[Pytorch, Huggingface] Pretrained Model 의 특정 Layer 만 Freeze 하기

애플파ol 2024. 4. 28. 16:22

► Pretrained되어 있는 모델을 load를 하면 Freeze(bias=False)되어 있는 것도 있고 Trainable한 파라미터(bias=True) 인 것도 있다.

     어떤 문제를 해결할 것이냐에 따라 Freeze가 유용할수도 있고 아닐 수도 있다.  이번 글에서는 Freeze를 하는 방법에 대해 소개와 동시에 필요한 layer만 Trainable하게 설정하는 방법을 알아보겠다.  

 

→ 특정 layer만을 Trainable 하게하는 방법은 다음과 같다. 

    1. 모든 layer에 대해 False로 설정 (=Freeze).

    2. 그 후 원하는 layer들에 대해서만 True로 설정. 

 

 

1.  모델로드

→ DETR모델 활용중

from transformers import DetrForObjectDetection
model_DETR= DetrForObjectDetection.from_pretrained("facebook/detr-resnet-50", revision="no_timm")

 

 

2.  모델 파라미터 수 확인

total_params = sum(p.numel() for p in model_DETR.parameters())
print("Total Parameters:", total_params)


total_trainable_params = sum(p.numel() for p in model_DETR.parameters() if p.requires_grad)
print("Total Trainable Parameters:", total_trainable_params)

total_fixed_params = sum(p.numel() for p in model_DETR.parameters() if not p.requires_grad)
print("Total Fixed Parameters:", total_fixed_params)

파라미터 출력 결과

3.  모든 layer에 대해 Freeze 수행.

► 모든 파라미터를 학습가능하지 않은, 고정된 파라미터로 설정.

for params in model_DETR.parameters():
    params.requires_grad = False

 

변경된 파라미터 수

 

4.  특정 layer에 대해 True 수행.

► 학습 가능한 파라미터로 변경.

 

→ 코드를 해석하자면 다음과 같다. DETR의 모든 파라미터를 for문을 통해 출력하는데 그중에서 'class_labels_classifier' 라는 모든 포함된 모든 파라미터들의 이름에 대해 True로 하겠다는 것이다.

for name, params in model_DETR.named_parameters():
    # class_labels_classifier 이 포함되어 있는것들만 True로 변경.
    if 'class_labels_classifier' in name:
        print(name)
        params.requires_grad = True

 

True로 바뀐 부분은 출력된 것과 같다.

 

DETR 모델의 파라미터 구조 중 일부.

 

 

5.  알맞게 Trainable한 파라미터로 변경 되었는지 확인 사살.

► 이미 4번 과정에서 변한것을 확인하였지만 필자는. 모델의 학습이 딱 돌아가는 코드 전에 한번도 확인을 위해 넣어둔다.

 

→ 학습가능한 파라미터는 Ture임으로 출력이 된다.

for name, params in model_DETR.named_parameters():
    if params.requires_grad:  # 학습가능한 파라미터는 TRUE임.
        #print('name of layer: ',name)
        #print('parmas size :',params.size())
        #print(parmas)        # 이부분을 출력하면 weight, bias가 출력됨.
        print(name)

 

출력 결과
실행 결과

 

 

 

참고 하면 좋은 글 :  Pretrained model을 가져오는데 Weight, bias 를 초기 값으로 설정해서 불러오고 싶을 때.

https://put-idea.tistory.com/117

 

[Huggingface] 가중치 없이 모델 로드 및 모델 구조 변경

1. 가중치 없이 모델 로드 ► 우리는 허깅페이스에서 weight, bias가 최적화 되어있는 pretrained된 모델을 사용한다. 하지만 모델의 weight, bias를 제외하고 아키텍쳐만 필요할 때가 있다. Hugging Face에서

put-idea.tistory.com

 

Comments