Я вроде новичок в 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>