반응형
나는조이
쑥쑥 크는 조이
나는조이
  • 분류 전체보기 (66)
    • 나누며 성장하기 (14)
      • Raktivist's Diary (4)
      • 성장 코칭 Growth Coaching (2)
      • 일상 · 생각 (8)
    • 읽고 성장하기 (1)
    • 공부하며 성장하기 (51)
      • 인공지능 AI (34)
      • AWS (1)
      • 파이썬 Python (6)
      • C# · WPF (1)
      • Fixing Errors (6)
      • 인사이트 리뷰 Insight Review (2)
      • AI-struction (1)

인기 글

최근 댓글

공지사항

  • def introduce(self):
전체 방문자
오늘
어제
ⓒ2022 @nanunzoey.All rights reserved.
hELLO · Designed By 정상우.
나는조이

쑥쑥 크는 조이

DeeplabV3+ 모델 전이 학습(transfer learning) 쉽게 구현하기
공부하며 성장하기/인공지능 AI

DeeplabV3+ 모델 전이 학습(transfer learning) 쉽게 구현하기

2023. 6. 15. 12:16

 

아래 repository를 기반으로 작성하였다.

 

GitHub - qubvel/segmentation_models.pytorch: Segmentation models with pretrained backbones. PyTorch.

Segmentation models with pretrained backbones. PyTorch. - GitHub - qubvel/segmentation_models.pytorch: Segmentation models with pretrained backbones. PyTorch.

github.com

 

1. Pretrained 모델 로드

# train.py

pretrained_model = smp.DeepLabV3Plus(
    encoder_name='resnet50', 
    encoder_weights=None, 
    in_channels=3, 
    classes=1
)
pretrained_model.load_state_dict(torch.load('pretrained_model.pth'))
pretrained_model.to(device)

encoder_weights=None으로 해야 한다. (default 값은 'imagenet')

 

2. (Optional) Freezing Layers

# Freeze all layers
for param in pretrained_model.parameters():
    param.requires_grad = False

# Unfreeze the last few layers (e.g., the classifier layers)
for param in pretrained_model.decoder.parameters():
    param.requires_grad = True

모델의 앞 쪽(lower) layer에서 보다 더 일반적인 특징들(edge나 texture 같은)을 더 잘 학습한다.
따라서 이 부분의 weights는 고정시켜두고 나머지 뒷 쪽(higher) layer만 업데이트하는 것을 고려해볼 수 있다.

 

특히 새로 학습하고자 하는 데이터셋의 크기가 작을 경우에는 이렇게 classifier 부분만 업데이트하는 것이 유리할 수 있다.

https://velog.io/@xuio/Transfer-Learning%EA%B3%BC-Fine-Tuning

위 그림처럼 데이터셋 크기와 데이터셋 또는 task의 유사도에 따라 오른쪽과 같은 fine-tuning 방식을 고민해볼 수 있다.

만약 lower layer도 일부 학습하도록 하고 싶다면 아래와 같이 원하는 layer 개수를 입력하여 구현하면 된다.

# Define the number of layers you want to unfreeze in the encoder. 
# The last 'n' layers of the encoder can be unfrozen for training.
n = 2 # You can define your value of n here

# Unfreeze the last 'n' layers in the encoder
for param in list(pretrained_model.encoder.parameters())[-n:]:
    param.requires_grad = True


얼마나 layer를 고정하는 것이 좋은지는 약간의 실험이 필요하다.
우선 몇 개 layer를 고정하는 것부터 시작해보고, 필요할 경우 고정하려는 layer 개수를 조정하는 것이 좋다.

또한 fine-tuning할 때에는 모든 layer를 학습시킬 때보다 learning rate이 조금 더 작은 것이 좋다.

코드를 전체적으로 살펴보면 다음과 같다.

    device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
    
    model = DeepLabV3Plus(
        encoder_name='resnet50',
        encoder_weights=None,
        in_channels=3,
        classes=1
    )
    model.load_state_dict(torch.load('pretrained_crack_model.pth'))
    
    for param in model.parameters():  # Freeze all layers
        param.requires_grad = False
    for param in model.decoder.parameters():  # Unfreeze the classifier layers
        param.requires_grad = True

    model.to(device)

    epochs = 1000
    loss_fn = DiceLoss('binary', from_logits=True)
    optimizer = torch.optim.Adam(model.parameters(), lr=1e-4, weight_decay=1e-3)
    scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=epochs, verbose=True)
    
    # dataset load -> run train()

 

반응형

'공부하며 성장하기 > 인공지능 AI' 카테고리의 다른 글

[한 줄 정리] 다양한 Normalization 기법들  (0) 2024.02.13
Object Detection에서 mAP_0.5와 mAP_0.5:0.95의 의미  (0) 2023.12.14
AMP(Automatic Mixed Precision) 쉽게 적용하기  (0) 2023.06.14
K-means Clustering  (0) 2023.05.21
Lasso regression  (0) 2023.05.21
    '공부하며 성장하기/인공지능 AI' 카테고리의 다른 글
    • [한 줄 정리] 다양한 Normalization 기법들
    • Object Detection에서 mAP_0.5와 mAP_0.5:0.95의 의미
    • AMP(Automatic Mixed Precision) 쉽게 적용하기
    • K-means Clustering
    나는조이
    나는조이
    매일 쑥쑥 크는 성장기를 담습니다.

    티스토리툴바