在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层),因此编码器权重将永远不会更新。因此,如果希望编码器学习,您可能应该而不是分离