pytorch fine-tune 예비 훈련 모델 작업
torchvision 에는 예비 훈련 된 모델 이 많이 포함 되 어 있어 fine-tune 이 매우 쉽다.본 고 는 주로 fine-tune torchvision 에서 미리 훈련 한 모델 을 소개 한다.
설치 하 다.
pip install torchvision
어떻게 fine-tuneresnet 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)
만약 모델 의 키 값 과 빅 데이터 세트 에서 훈련 할 때의 키 값 이 다르다 면 순서 도 다르다스스로 대응 관 계 를 찾 고,키 하 나 는 키 의 할당 에 대응 합 니 다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정확도에서 스케일링의 영향데이터셋 스케일링은 데이터 전처리의 주요 단계 중 하나이며, 데이터 변수의 범위를 줄이기 위해 수행됩니다. 이미지와 관련하여 가능한 최소-최대 값 범위는 항상 0-255이며, 이는 255가 최대값임을 의미합니다. 따...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.