pytorch fine-tune 예비 훈련 모델 작업

하나:
torchvision 에는 예비 훈련 된 모델 이 많이 포함 되 어 있어 fine-tune 이 매우 쉽다.본 고 는 주로 fine-tune torchvision 에서 미리 훈련 한 모델 을 소개 한다.
설치 하 다.

pip install torchvision
어떻게 fine-tune
resnet 18 을 예 로 들 면:

from torchvision import models
from torch import nn
from torch import optim
 
resnet_model = models.resnet18(pretrained=True) 
# pretrained     True,             ,       
#           ,   load      ,          。
 
#                  100  ,         
# 1.    resnet    
# 2.             (  resnet    self.fc = nn.Linear(512 * block.expansion, num_classes))
# 3.          
resnet_model.fc= nn.Linear(in_features=..., out_features=100)
 
#       ,                      ,                。
 
#              ,     :
# 1.         requires_grad     False
# 2.      optimizer, optimizer               
# 3.    backward, step     
 
#             ,              
for para in list(resnet_model.parameters())[:-2]:
    para.requires_grad=False 
 
optimizer = optim.SGD(params=[resnet_model.fc.weight, resnet_model.fc.bias], lr=1e-3)
 
...
왜?
resnet 실행 을 소개 합 니 다.model.fc= nn.Linear(in_features=..., out_features=100)프레임 안에서 무슨 일이 일 어 났 는 지
이 때 는 N.Module 소스 의 를 봐 야 합 니 다.setattr__ 부분,setattr 때 이 방법 을 사용 하기 때 문 입 니 다.

def __setattr__(self, name, value):
    def remove_from(*dicts):
        for d in dicts:
            if name in d:
                del d[name]
우선 눈 에 띄 는 건 removefrom 이 함수,이 함수 의 목적 은 같은 이름 의 속성 이 나타 나 면 오래된 속성 을 제거 하 는 것 입 니 다.방금 예 를 들 면:
예비 훈련 모델 중 fc 라 는 모듈 이 있 습 니 다.
클래스 정의 외 에 우 리 는 다른 Module 을 fc 에 다시 할당 합 니 다.
클래스 정의 에 있 는 fc 에 대응 하 는 Module 은 모델 에서 삭 제 됩 니 다.
둘:
머리말
이 글 은 포럼 이 라 고 할 수 있 습 니 다PyTorch Forums매개 변수 초기 화 와 finetune 에 대한 정리 이자 제 가 코드 를 쓰 는 데 사용 하 는 것 은'최고의 실천'이 라 고 할 수 있 습 니 다.마지막 으로 여러분 들 이 할 일이 없 으 면 포럼 을 많이 돌아 보고 질 좋 은 대답 이 많 기 를 바 랍 니 다.
매개 변수 초기 화
매개 변수의 초기 화 는 사실 매개 변수 에 대한 값 을 부여 하 는 것 이다.그리고 우리 가 배 워 야 할 매개 변 수 는 모두 Variable 입 니 다.이것 은 Tensor 에 대한 패키지 이 고 data,grad 등 핑 계 를 제공 합 니 다.이것 은 우리 가 이 매개 변 수 를 직접 조작 할 수 있다 는 것 을 의미 합 니 다.이것 이 바로 PyTorch 의 간결 하고 효율 적 인 곳 이다.
这里写图片描述
그래서 우 리 는 다음 과 같은 조작 을 해서 초기 화 할 수 있다.물론 다른 방법 이 있 지만 이런 방법 은 PyTorch 작가 가 추앙 하 는 것 이다.

def weight_init(m):
#   isinstance   m      
    if isinstance(m, nn.Conv2d):
        n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels
        m.weight.data.normal_(0, math.sqrt(2. / n))
    elif isinstance(m, nn.BatchNorm2d):
# m  weight,bias    Variable,             
        m.weight.data.fill_(1)
        m.bias.data.zero_()
Finetune
흔히 예비 훈련 모델 의 인 자 를 불 러 온 후에 우 리 는 finetune 모델 이 필요 하고 서로 다른 방식 으로 finetune 을 사용 할 수 있 습 니 다.
국부 미조정
때때로 우 리 는 훈련 모델 을 탑재 한 후 마지막 몇 층 만 조절 하고 다른 층 은 훈련 하지 않 는 다.사실 훈련 을 하지 않 는 다 는 것 은 경사도 계산 을 하지 않 는 다 는 것 을 의미한다.PyTorch 에서 제공 하 는 requiresgrad 는 훈련 에 대한 통 제 를 매우 간단하게 만 들 었 다.

model = torchvision.models.resnet18(pretrained=True)
for param in model.parameters():
    param.requires_grad = False
#          ,     100 
#            requires_grad True
model.fc = nn.Linear(512, 100)
 
#          
optimizer = optim.SGD(model.fc.parameters(), lr=1e-2, momentum=0.9)
전역 미조정
때때로 우 리 는 전체 국면 에 대해 finetune 을 진행 해 야 한다.단지 우리 가 바 꾼 층 과 다른 층 의 학습 속도 가 다 르 기 를 바 랄 뿐이다.이때 우 리 는 다른 층 과 새로운 층 을 optimizer 에서 서로 다른 학습 속 도 를 단독으로 부여 할 수 있다.예 를 들 면:

ignored_params = list(map(id, model.fc.parameters()))
base_params = filter(lambda p: id(p) not in ignored_params,
                     model.parameters())
 
optimizer = torch.optim.SGD([
            {'params': base_params},
            {'params': model.fc.parameters(), 'lr': 1e-3}
            ], lr=1e-2, momentum=0.9)
그 중 baseparams 는 1e-3 을 사용 하여 훈련 하고,model.fc.parameters 는 1e-2 를 사용 하여 훈련 하 며,momentum 은 둘 다 공유 합 니 다.
의 3:
pytorch finetune 모델
글 은 pytorch 에서 기 존 에 훈련 된 모델 파 라 메 터 를 읽 는 방법,모델 의 이름 이 변 경 된 상황 에서 모델 의 일부 파 라 메 터 를 어떻게 읽 는 지 등 을 다 루 고 있다.
pytorch 모델 의 저장 및 읽 기
그 중에서 모델 의 저장 과정 에 저장 모델 과 파라미터 가 함께 있 는 것 도 있 고 모델 파 라 메 터 를 따로 저장 하 는 것 도 있다.
단독 저장 모델 파라미터
저장 할 때 사용:

torch.save(the_model.state_dict(), PATH)
읽 기 시간:

the_model = TheModelClass(*args, **kwargs)
the_model.load_state_dict(torch.load(PATH))
메모리 모델 과 매개 변수
저장 소:

torch.save(the_model, PATH)
읽 기:

the_model = torch.load(PATH)
모델 의 매개 변수
fine-tune 의 과정 은 기 존 모델 의 인 자 를 읽 는 것 입 니 다.그러나 모델 이 처리 하고 자 하 는 데이터 세트 가 다 르 기 때문에 마지막 class 의 총수 가 다 르 기 때문에 모델 의 마지막 층 을 수정 해 야 합 니 다.이렇게 모델 이 읽 는 인 자 는 빅 데이터 세트 에서 다운로드 하도록 훈련 한 모델 파라미터 와 형식 이 다 릅 니 다.함수 읽 기 파 라 메 터 를 직접 써 야 합 니 다.
pytorch 모델 매개 변수 형식
모델 의 매개 변 수 는 사전 형식 으로 저장 된다.

model_dict = the_model.state_dict(),
for k,v in model_dict.items():
    print(k)
모든 키 값 을 볼 수 있 습 니 다.
모델 의 인 자 를 수정 하려 면 해당 키 값 에 값 을 부여 하면 됩 니 다.

model_dict[k] = new_value
마지막 으로 모델 의 매개 변 수 를 업데이트 합 니 다.

the_model.load_state_dict(model_dict)
만약 모델 의 키 값 이 빅 데이터 세트 에서 훈련 할 때의 키 값 과 같다 면
우 리 는 다음 알고리즘 을 통 해 모델 을 읽 을 수 있다.

model_dict = model.state_dict() 
pretrained_dict = torch.load(model_path)
 # 1. filter out unnecessary keys
diff = {k: v for k, v in model_dict.items() if \
            k in pretrained_dict and pretrained_dict[k].size() == v.size()}
pretrained_dict = {k: v for k, v in pretrained_dict.items() if k in model_dict and model_dict[k].size() == v.size()}
pretrained_dict.update(diff)
# 2. overwrite entries in the existing state dict
model_dict.update(pretrained_dict)
# 3. load the new state dict
model.load_state_dict(model_dict)
모델 의 키 값 이 빅 데이터 세트 에서 훈련 할 때의 키 값 과 다르다 면 순 서 는 같 습 니 다.

model_dict = model.state_dict() 
pretrained_dict = torch.load(model_path)
keys = []
for k,v in pretrained_dict.items():
    keys.append(k)
i = 0
for k,v in model_dict.items():
    if v.size() == pretrained_dict[keys[i]].size():
        print(k, ',', keys[i])
         model_dict[k]=pretrained_dict[keys[i]]
    i = i + 1
model.load_state_dict(model_dict)
만약 모델 의 키 값 과 빅 데이터 세트 에서 훈련 할 때의 키 값 이 다르다 면 순서 도 다르다
스스로 대응 관 계 를 찾 고,키 하 나 는 키 의 할당 에 대응 합 니 다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기