#pytorch
#pytorch
Вопрос:
Я создаю генератор g
, который получает скрытый код (вектор формы 100) и выводит изображение. В частности, у меня есть 1000 изображений MNIST, и я хочу, чтобы сеть изучала скрытый код z_i
для каждого изображения x_i
, такой, что g(z_i)=x_i
(этот подход известен как генеративная скрытая оптимизация). Итак, я использовал nn.Embedding(1000,embedding_dim= 100) и стандартную архитектуру генератора, которая получает код от встраивания и выводит изображение. Что касается потерь, я объединяю потери при восстановлении с регуляризацией весов вектора встраивания.
Моя проблема: я хотел бы добавить шум к вектору скрытого кода перед его вставкой в генератор (чтобы сделать скрытый код компактным). Однако я новичок, и я не знаю, должен ли я вызывать detach() при добавлении шума или нет. Я не совсем уверен в своем подходе. Я не хочу изучать масштаб шума или что-то еще. Вот моя попытка:
class net(nn.Module):
def __init__():
self.embed = nn.Embedding(1000,embedding_dim=100)
self.generator = nn.sequential( nn.Linear(100, 84), .... )
def forward(batch_indices):
batch_codes = self.embed(batch_indices)
noise = torch.randn_like(batch_codes) * sigma
noisy_batch_codes = batch_codes noise # SHOULD THIS BE batch_codes.detach() noise ??
return self.generator(noisy_batch_codes)
g = net()
optim = SGD(g.parameters(), lr=0.01)
for epoch in range(num_epochs):
for orig_images, orig_images_idx in trainloader:
optim.zero_grad()
output = g(orig_images_idx)
reconstruction_loss = nn.MSELoss()(output, orig_images)
embed_vector_weights = g.embed.weight[orig_images_idx]
reg_loss = torch.norm(embed_vector_weights) * reg_coeff
loss = reconstruction_loss reg_loss
loss.backward()
optim.step()
Ответ №1:
Если вы отсоедините его перед добавлением шума, градиенты не будут распространяться на ваш кодировщик (в данном случае emedding layer), поэтому веса вашего кодировщика никогда не будут обновлены. Поэтому вам, вероятно, не следует отключаться, если вы хотите, чтобы кодировщик обучался.