Обновлять веса динамически (относительно ввода) с помощью pytorch - PullRequest
0 голосов
/ 17 июня 2020
• 1000 Моя модель похожа на
# architecture Autorec
class Model(nn.Module):

    def __init__(self, num_latent, num_items, dropout=0.05):
        super(Model, self).__init__()
        self.encoder = nn.Linear(num_items, num_latent)
        self.decoder = nn.Linear(num_latent, num_items)
    def forward(self, inputs):
        x = self.encoder(inputs)
        x = F.leaky_relu(x)
        outputs = self.decoder(x)
        #outputs = F.linear(x)
        return outputs

И функция поезда выглядит как

def train(num_epochs, batch_size, criterion, optimizer, model, dataset):
    dataloader = DataLoader(dataset, batch_size, shuffle=True)
    train_error = []
    test_error = []
    model.train()
    for epoch in range(num_epochs):
        epoch_average_loss = 0.0
        for (X, y) in (dataloader):
            print(X.requires_grad())
            y_pre = model(X)
            loss = criterion(y_pre, y)
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()
            epoch_average_loss += loss.item() * batch_size / len(train_set)
        model.eval()
        with torch.no_grad():
          y_pre_val = model(torch.from_numpy(np.array(w_test)).float())
        error = criterion(y_pre_val, torch.tensor(np.array(w_test_merged)).float()).item()
        test_error.append(error)
        train_error.append(epoch_average_loss)
        if ((epoch+1)%1 == 0):
                print('Epoch [{}/{}], Loss_error: {:.4f}'
                      .format(epoch+1, num_epochs,  epoch_average_loss))
    return train_error, test_error

Итак, во-первых, как обновить только вес, связанный с вводом, отличным от нуля? Я знаю, что должен использовать requires_grad = False, но не знаю, как.

Тогда есть ли способ сделать это с помощью batch_size> 1?

...