回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>对不起,我不知道该怎么解决。
我使用两个网络来构造两个嵌入,我有一个二进制目标来指示embeddingA和embeddingB是否匹配(1或-1)。
数据集如下所示:</p>
<pre><code>embA0 embB0 1.0
embA1 embB1 -1.0
embA2 embB2 1.0
...
</code></pre>
<p>我希望使用余弦相似性来得到分类结果。
但我在选择损失函数时感到困惑,生成嵌入的两个网络是分开训练的,现在我可以想到以下两个选项:</p>
<p><strong>计划1:</strong></p>
<p>构造第三个网络,使用EmbeddedingA和EmbeddedingB作为nn.cosinesimilarity()的输入来计算最终结果(应为[-1,1]中的概率),然后选择一个两类损失函数</p>
<p>(对不起,我不知道该选择哪个损失函数。)</p>
<pre><code>class cos_Similarity(nn.Module):
def __init__(self):
super(cos_Similarity,self).__init__()
cos=nn.CosineSimilarity(dim=2)
embA=generator_A()
embB=generator_B()
def forward(self,a,b):
output_a=embA(a)
output_b=embB(b)
return cos(output_a,output_b)
loss_func=nn.CrossEntropyLoss()
y=cos_Similarity(a,b)
loss=loss_func(y,target)
acc=np.int64(y>0)
</code></pre>
<p><strong>计划2:</strong>
这两个嵌入作为输出,然后使用nn.cosinembeddingloss()作为损失函数,当我计算精度时,我使用nn.Cosinesimilarity()输出结果(概率为[-1,1])</p>
<pre><code>output_a=embA(a)
output_b=embB(b)
cos=nn.CosineSimilarity(dim=2)
loss_function = torch.nn.CosineEmbeddingLoss()
loss=loss_function(output_a,output_b,target)
acc=cos(output_a,output_b)
</code></pre>
<p>我真的需要帮助。我如何做出选择?为什么?或者我只能通过实验结果为自己做出选择。
多谢各位</p>
<p>######################################</p>
<pre><code>
def train_func(train_loss_list):
train_data=load_data('train')
trainloader = DataLoader(train_data, batch_size=BATCH_SIZE)
cos_smi=nn.CosineSimilarity(dim=2)
train_loss = 0
for step,(a,b,target) in enumerate(trainloader):
try:
optimizer.zero_grad()
output_a = model_A(a) #generate embA
output_b = model_B(b) #generate embB
acc=cos_smi(output_a,output_b)
loss = loss_fn(output_a,output_b, target.unsqueeze(dim=1))
train_loss += loss.item()
loss.backward()
optimizer.step()
train_loss_list.append(loss)
if step%10==0:
print('train:',step,'step','loss:',loss,'acc',acc)
except Exception as e:
print('train:',step,'step')
print(repr(e))
return train_loss_list,train_loss/len(trainloader)
</code></pre>