【问题标题】:Differentiable loss from the difference of 2 lists来自 2 个列表的差异的可微分损失
【发布时间】:2021-05-03 20:45:57
【问题描述】:

我有模特

import torch
from torch.autograd import grad
import torch.nn as nn
import torch.optim as optim

class net_x(nn.Module): 
        def __init__(self):
            super(net_x, self).__init__()
            self.fc1=nn.Linear(1, 1) 
            self.out=nn.Linear(1, 1) 

        def forward(self, x):
            x=self.fc1(x)
            x=self.out(x)
            return x

nx = net_x()
#inputs
t = torch.tensor([1.0, 2.0, 3.2], requires_grad = True) #input vector
t = torch.reshape(t, (3,1)) #reshape for batch

还有 2 个列表:

pred_lst = [] 
goal_lst = list(range(10))

我试图得到这两个列表之间的损失如下:

for epoch in range(10):
    optimizer.zero_grad()
    y = nx(t)
    if torch.sum(y) > 5:
        pred_lst.append(epoch) 
    else:
        pass
    loss = len(set(pred_lst).symmetric_difference(set(goal_lst)))
    loss = torch.tensor(float(loss), requires_grad = True)
    print('loss: ', loss)
    loss.backward()

但是参数没有更新,因为symmetric_difference 是一个不可微分的操作。 我如何修改/使用其他东西来获取这两个列表并给我一个可以反向传播的可微损失?

【问题讨论】:

  • 是否存在一组可能的列表元素?如果是这样,即使有很多可能的元素,您也可以简单地使用 k-hot 编码和 L1 损失
  • 是的,实际上训练有一个有限集。我会相信你的尺寸部分(因为它很大)。你能解释一下热编码部分吗?假设我在我的goal_list 中有值1,2,3,4,在我的pred_list 中有值1,2,7。并且元素的有限集是range(100)。下一步是什么?
  • 这能回答你的问题吗? Finding non-intersection of two pytorch tensors
  • 实际上,我不确定您是如何从神经网络中创建离散列表的,但是无论您这样做,这似乎本身就是一个不可微分的操作。
  • @DerekG 是的,我明白你的意思,但不幸的是,我目前还没有解决办法。根据我的 NN 的输出,我需要将项目添加到一个列表中,最后与目标列表进行比较

标签: python neural-network pytorch


【解决方案1】:

抛开不可微性的问题,下面是你如何使用 K-hot 编码和 L1:

label_vec = torch.zeros(100).float()
label_vec[goal_lst] = 1

pred_vec = torch.zeros(100).float()
pred_vec[pred_lst] = 1

loss = torch.nn.L1Loss(pred_vec,label_vec)

但索引操作相对于我认为的索引是不可微分的。

似乎要解决此问题,一种解决方案是让您的 NN 本机输出向量 (pred_vec) 而不是列表。此外,该向量应该可能包含 [0,1] 范围内的值,以便梯度包含有意义的信息。标准做法是在训练期间输出连续预测,并使用一些截止值来确定最终离散输出列表以进行推理。

【讨论】:

    猜你喜欢
    • 2019-06-14
    • 2020-02-04
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 2021-03-27
    • 1970-01-01
    相关资源
    最近更新 更多