하나의 옵티마이 저가 전체 매개 변수를 훈련시키고 다른 하나는 매개 변수의 일부를 훈련 시키도록 두 개의 옵티 마이저를 갖는 방법은 무엇입니까?

벤당

모델이 있습니다.

class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        self.conv1 = nn.Conv2d(128, 128, (3,3))
        self.conv2 = nn.Conv2d(128, 256, (3,3))
        self.conv3 = nn.Conv2d(256, 256, (3,3))

    def forward(self,):
        x = F.relu(self.conv1(x))
        x = F.relu(self.conv2(x))
        x = F.relu(self.conv3(x))
        return x

model = MyModel()

나는 모든 교육 단계에서 것과 같은 방식으로 모델을 학습하고자하는 DATA_X1훈련을해야 ['conv1', 'conv2', 'conv3']레이어를하고 DATA_X2유일한 훈련해야 ['conv3']레이어를.

두 가지 최적화 프로그램을 만들어 보았습니다.

# Full parameters train
all_params = model.parameters()
all_optimizer = optim.Adam(all_params, lr=0.01)

# Partial parameters train
partial_params = model.parameters()
for p, (name, param) in zip(list(partial_params), model.named_parameters()):
    if name in ['conv3']:
        p.requires_grad = True
    else:
        p.requires_grad = False
partial_optimizer = optim.Adam(partial_params, lr=0.01)

그러나 이것은 최적화 프로그램 모두에 영향을 미칩니다. required_grad = False

내가 할 수있는 방법이 있습니까?

샤이

이 기능을 모델에 빌드하지 않는 이유는 무엇입니까?

class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        self.conv1 = nn.Conv2d(128, 128, (3,3))
        self.conv2 = nn.Conv2d(128, 256, (3,3))
        self.conv3 = nn.Conv2d(256, 256, (3,3))
        self.partial_grad = False  # a flag

    def forward(self, x):
        if self.partial_grad:
            with torch.no_grad():
                x = F.relu(self.conv1(x))
                x = F.relu(self.conv2(x))
        else:
            x = F.relu(self.conv1(x))
            x = F.relu(self.conv2(x))     
        x = F.relu(self.conv3(x))
        return x

이제 모든 매개 변수 가있는 단일 최적화 프로그램 을 사용할 수 있으며 model.partial_grad훈련 데이터에 따라 스위치 를 켜고 끌 수 있습니다 .

optimizer.zero_grad()
model.partial_grad = False  # prep for DATA_X1 training
x1, y1 = DATA_X1.item()  # this is not really a code, but you get the point
out = model(x1)
loss = criterion(out, y1)
loss.backward()
optimizer.step()  

# do a partial opt for DATA_X2
optimizer.zero_grad()
model.partial_grad = True  # prep for DATA_X2 training
x2, y2 = DATA_X2.item()  # this is not really a code, but you get the point
out = model(x2)
loss = criterion(out, y2)
loss.backward()
optimizer.step()  

단일 옵티마이 저가 있으면 두 데이터 세트에서 모멘텀과 매개 변수의 변경을 추적 할 수 있으므로 더 유용합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관