为什么余弦相似度总是算为1?

问题描述 投票:0回答:1

在做学校项目时,遇到一个问题,余弦相似度总是测量为1。我无奈地质疑余弦相似度总是测量为1,因为我确认了tensor1和tensor2是不同的。为什么余弦相似度总是测量为 1?

  1. 训练代码
for i, (_image1, _label1) in enumerate(train_loader):
    image1 = _image1.to(DEVICE)
    label1 = _label1[0]
    vector1_tensor = model(image1)
  
    if (i == 0): #Exception Case
      image2 = image1
      label2 = label1
      vector2_tensor = vector1_tensor
   
     #PROBLEM LOCATION 

     similarity =  F.cosine_similarity(vector1_tensor, vector2_tensor, dim = -1)
     scaled_similarity = torch.sigmoid(similarity)

    if label1 == label2:
      target_vector = [1]
    else :
      target_vector = [0]

    target_tensor = torch.tensor(target_vector).float()
    target_tensor = target_tensor.to(DEVICE)

    optimizer.zero_grad()
    cost = loss(scaled_similarity, target_tensor)
    cost.backward()
    optimizer.step()

    if not i % 40:
      print (f'Epoch: {epoch:03d}/{EPOCH:03d} | '
            f'Batch {i:03d}/{len(train_loader):03d} |'
             f' Cost: {cost:.4f}')

    #Recycle tensor for reduced computation
    image2 = image1.clone()
    label2 = label1
    vector2_tensor = vector1_tensor.detach()
  1. 模型定义代码
class trans_VGG(nn.Module):
    def __init__(self, base_dim):
        super(trans_VGG, self).__init__()
        self.feature = nn.Sequential(
            conv_2(3, base_dim),
            conv_2(base_dim, base_dim*2),
            conv_2(base_dim*2, base_dim*4),
            conv_3(base_dim*4, base_dim*8),
            conv_3(base_dim*8, base_dim*8)
        )
        self.fc_layer = nn.Sequential(
            nn.Linear(base_dim*8*7*7, 4096),
            nn.ReLU(True),
            nn.Dropout(),
            nn.Linear(4096, 1000),
            nn.ReLU(True),
            nn.Dropout(),
            nn.Linear(1000, 800)
        )
        for param in self.parameters():
            param.requires_grad = True

    def forward(self, x):
        x = self.feature(x)
        x = x.view(x.size(0), -1)
        x = self.fc_layer(x)
        return x
  1. 我们没有使用Pytorch的余弦相似度函数,而是自己创建并计算了余弦相似度函数,发现余弦相似度仍然是1。
  2. 我们发现sensor1和sensor2的值不一样。
  3. 这个模型是一个VGG模型,通过嵌入经过VGG模型的两个张量来获得两个张量之间的相似度。
pytorch computer-vision conv-neural-network cosine-similarity vgg-net
1个回答
0
投票

余弦相似度衡量向量之间的角度。具有不同大小但仍指向同一方向的向量的余弦相似度为 1。

© www.soinside.com 2019 - 2024. All rights reserved.