【发布时间】: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)。下一步是什么? -
实际上,我不确定您是如何从神经网络中创建离散列表的,但是无论您这样做,这似乎本身就是一个不可微分的操作。
-
@DerekG 是的,我明白你的意思,但不幸的是,我目前还没有解决办法。根据我的 NN 的输出,我需要将项目添加到一个列表中,最后与目标列表进行比较
标签: python neural-network pytorch