PyTorch - пользовательская функция потерь - расчеты вне графика - PullRequest
0 голосов
/ 22 января 2020

Я вроде новичок в pytorch и пытаюсь обернуть голову вокруг него. Я читал о пользовательских функциях потерь, и, насколько я видел, они не могут быть отделены от внутреннего вычислительного графа. Это означает, что функция потерь потребляет тензоры, выполняет над ними операции, которые реализованы в pytorch, и выводит тензор. Можно ли каким-то образом рассчитать потери потерь и как-то подключить их обратно?

Вариант использования

Я пытаюсь обучить кодировщик, где будет оптимизировано скрытое пространство к некоторому статистическому качеству. Это означает, что я не тренируюсь партиями и вычисляю значение единой потери для всей эпохи и всего набора данных. Можно ли даже научить net таким образом?

class Encoder(nn.Module):
    def __init__(self, genome_size: int):
        super(Encoder, self).__init__()

        self.fc1 = nn.Linear(genome_size, genome_size)
        self.fc2 = nn.Linear(genome_size, genome_size)
        self.fc3 = nn.Linear(genome_size, genome_size)

        self.genome_size = genome_size

    def forward(self, x):
        x = self.fc1(x)
        x = self.fc2(x)
        x = self.fc3(x)

        return x
def train_encoder(
    net: nn.Module,
    optimizer: Optimizer,
    epochs: int,
    population: Tensor,
    fitness: Tensor,
):
    running_loss = 0.0

    for epoch in range(epochs):

        optimizer.zero_grad()
        outputs = net(population)

        # encoder_loss is computationally heavy and cannot be done only on tensors
        # I need to unwrap those tensors to numpy arrays and use them as an input to another model
        loss = encoder_loss(outputs, fitness)
        running_loss += loss

        running_loss.backward()
        optimizer.step()

        print('Encoder loss:', loss)

Я видел несколько примеров с накопленным running_loss, но мой кодировщик не может ничего узнать. Сходимость сюжет просто прыгает повсюду.

Спасибо за ваше время <3 </p>

...