Веса моделей не обновляются, но потери снижаются - PullRequest
0 голосов
/ 19 сентября 2019

Следующий код предназначен для обучения MLP с изображениями размером 64 * 64, при этом используется потеря || output - input || ^ 2.

По какой-то причине мои веса за эпоху не былиобновляется, как показано в конце.

class MLP(nn.Module):
    def __init__(self, size_list):
        super(MLP, self).__init__()
        layers = []
        self.size_list = size_list
        for i in range(len(size_list) - 2):
            layers.append(nn.Linear(size_list[i],size_list[i+1]))
            layers.append(nn.ReLU())
        layers.append(nn.Linear(size_list[-2], size_list[-1]))
        self.net = nn.Sequential(*layers)

    def forward(self, x):
        return self.net(x)

model_1 = MLP([4096, 64, 4096])

И для обучения каждая эпоха:

def train_epoch(model, train_loader, criterion, optimizer):
    model.train()
    model.to(device)

running_loss = 0.0

    start_time = time.time()
    # train batch
    for batch_idx, (data) in enumerate(train_loader):   
        optimizer.zero_grad() 

        data = data.to(device)

        outputs = model(data)
        loss = criterion(outputs, data)
        running_loss += loss.item()

        loss.backward()
        optimizer.step()

    end_time = time.time()

    weight_ll = model.net[0].weight
    running_loss /= len(train_loader)

    print('Training Loss: ', running_loss, 'Time: ',end_time - start_time, 's')
    return running_loss, outputs, weight_ll

для обучения данных:

n_epochs = 20
Train_loss = []
weights=[]

criterion = nn.MSELoss()

optimizer = optim.SGD(model_1.parameters(), lr = 0.1)


for i in range(n_epochs):
    train_loss, output, weights_ll = train_epoch(model_1, trainloader, criterion, optimizer)
    Train_loss.append(train_loss)
    weights.append(weights_ll)
    print('='*20)

Теперь, когда я печатаювеса первого полностью связанного слоя за эпоху они не обновляются.

print(weights[0][0])
print(weights[19][0])

Вывод для вышеупомянутого равен (показывает вес в эпоху 0 и в эпоху 19):

tensor([ 0.0086,  0.0069, -0.0048,  ..., -0.0082, -0.0115, -0.0133],
       grad_fn=<SelectBackward>)
tensor([ 0.0086,  0.0069, -0.0048,  ..., -0.0082, -0.0115, -0.0133],
       grad_fn=<SelectBackward>)

Что может быть не так?Глядя на мою потерю, она уменьшается с постоянной скоростью, но вес не меняется.

1 Ответ

0 голосов
/ 20 сентября 2019

Попробуйте изменить его weight_ll = model.net[0].weight.clone().detach() или просто weight_ll = model.net[0].weight.clone() в вашей функции train_epoch().И вы увидите, что веса различаются.

Объяснение: weights_ll всегда являются последними значениями эпох, если вы не клонируете их.Он будет рассматриваться как тот же тензор на графе.Вот почему ваши weights[0][0] равны weights[19][0], они на самом деле один и тот же тензор.

...