Python 两个列表之差的可微损失

Python 两个列表之差的可微损失,python,neural-network,pytorch,Python,Neural Network,Pytorch,我有一个模型 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) se

我有一个模型

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的方法:

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]范围内的值,以便梯度包含有意义的信息。标准做法是在培训期间输出连续预测,并使用一些截止值来确定最终离散输出列表,以便进行推断。

是否有一组有限的可能列表元素?如果是这样的话,即使有很多可能的元素,你也可以简单地使用k-hot编码和L1 lossYea,因为训练实际上有一个有限的集合。我相信你的尺寸(因为它相当大)。你能解释一下热编码部分吗?假设我在我的
目标列表中有
1,2,3,4
,在我的
pred\u列表中有
1,2,7
值。有限元素集是
范围(100)
。下一步是什么?这回答了你的问题吗?事实上,我不确定你是如何从神经网络中创建一个离散列表的,但不管你怎么做,它似乎本身就是一个不可微的运算。@DerekG是的,我明白你的意思,但不幸的是,我现在看不到解决这个问题的方法。根据NN的输出,我需要将项目添加到一个列表中,并在最后与目标列表进行比较