PyTorch中的可学习标量权重
我有两个并行运行的神经网络。每个都给出了一个相同大小的特征图,比如Nx1。现在我想要这些嵌入的加权平均值,比如w1*embed1+w2*embed2。我试过了,但是重量没有更新。任何帮助都将不胜感激。以下是我试图做到这一点的方式:PyTorch中的可学习标量权重,pytorch,concatenation,embedding,weighted-average,Pytorch,Concatenation,Embedding,Weighted Average,我有两个并行运行的神经网络。每个都给出了一个相同大小的特征图,比如Nx1。现在我想要这些嵌入的加权平均值,比如w1*embed1+w2*embed2。我试过了,但是重量没有更新。任何帮助都将不胜感激。以下是我试图做到这一点的方式: class LinearWeightedAvg(nn.Module): def __init__(self, n_inputs): super(LinearWeightedAvg, self).__init__() self
class LinearWeightedAvg(nn.Module):
def __init__(self, n_inputs):
super(LinearWeightedAvg, self).__init__()
self.weight1 = Variable(torch.randn(1), requires_grad=True).cuda()
self.weight2 = Variable(torch.randn(1), requires_grad=True).cuda()
def forward(self, inp_embed):
return self.weight1 * inp_embed[0] + self.weight2 * inp_embed[1]
class EmbedBranch(nn.Module):
def __init__(self, feat_dim, embedding_dim):
super(EmbedBranch, self).__init__()
fc_layer1 = fc_layer
def forward(self, x):
x = self.fc_layer1(x)
return x
class EmbeddingNetwork(nn.Module):
def __init__(self, args, N):
super(EmbeddingNetwork, self).__init__()
embedding_dim = N
self.embed1 = EmbedBranch(N, N)
self.embed2 = EmbedBranch(N, N)
self.comb_branch = LinearWeightedAvg(metric_dim)
self.args = args
if args.cuda:
self.cuda()
def forward(self, emb1, emb2):
embeds1 = self.text_branch(emb1)
embeds2 = self.image_branch(emb2)
combined = self.comb_branch([embeds1, embeds2])
return combined
def train_forward(self, embed1, embed2):
combined = self(embed1, embed2)
embeds = model.train_forward(embed1, embed2)
loss = loss_func(embeds, labels)
running_loss.update(loss.data.item())
optimizer.zero_grad()
loss.backward()
我还希望重量在0-1范围内
谢谢,您应该使用
self.weightx=torch.nn.参数(您的初始张量)
将张量注册为模型的可学习参数。您使用的是什么pytorch版本<代码>变量()self.weight1=tf.nn.Parameter(torch.randn(1),需要_grad=True)self.weight2=tf.nn.Parameter(torch.randn(1),需要_grad=True)
。因此,可能还有另一个问题。在您的代码片段中,您没有显示如何设置优化器,您是否可以显示如何设置优化器?您真的将该模型的参数添加到优化器中了吗?这里:optimizer=AdamOptimizer()combinedEmbed=model.train\u forward(embed1,embed2)loss=loss\u func(combinedEmbed,labels)running\u loss.update(loss.data.item())optimizer.zero\u grad()loss.backward()
这正是您的第二个问题:优化器不知道要优化哪些参数。您需要通过提供一个它应该优化的张量列表(或其他集合)来告诉它。下次请提供一份完整的表格。