在pytorch中使用嵌入层时添加噪声

在pytorch中使用嵌入层时添加噪声,pytorch,Pytorch,我正在构建一个生成器g,它接收一个潜在代码(形状为100的向量)并输出一个图像。具体来说,我有1000个MNIST图像,我希望网络为每个图像学习一个潜在代码z_I,这样g(z_I)=x_I(这种方法称为生成性潜在优化)。所以我使用了nn.Embedding(1000,Embedding_dim=100)和标准生成器体系结构,它从嵌入中接收代码并输出图像。对于损失,我将重建损失与嵌入向量权重的正则化相结合 我的问题是:我想在潜在代码向量插入生成器之前向其添加噪声(以便使潜在代码紧凑)。但是,我是一

我正在构建一个生成器
g
,它接收一个潜在代码(形状为100的向量)并输出一个图像。具体来说,我有1000个MNIST图像,我希望网络为每个图像学习一个潜在代码
z_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()

如果在添加噪波之前分离,渐变将不会传播到编码器(本例中为eMedting层),因此编码器权重将永远不会更新。因此,如果希望编码器学习,您可能应该而不是分离