gpt4 book ai didi

python - 在 Pytorch 上实现 FCN 的损失函数

转载 作者:太空宇宙 更新时间:2023-11-03 20:39:56 25 4
gpt4 key购买 nike

我正在尝试为 FCN 实现损失函数。我的输出是形状为 (n, c, h, w) 的张量。我的目标形状为 (h, w)。我想计算输出和张量之间的损失,但问题是我有一个掩模。我只对图像的特定部分计算损失和训练感兴趣(我想忽略其余部分)。我试图通过将图像展开为数组然后在其上应用蒙版来实现我的目标。然后我会计算损失。当我这样做时,我收到一个错误:

RuntimeError: Assertion `cur_target >= 0 && cur_target < n_classes’ failed. at /pytorch/aten/src/THNN/generic/ClassNLLCriterion.c:93

请查看我的代码(可能有更简单的方法来执行此操作,因为我是新手):

def Loss(inp, target, mask):
mask=torch.from_numpy(np.array(mask, dtype=np.uint8))
target=target.contiguous().view(-1,1) #Flattening the Target Image
mask = mask.contiguous().view(-1, 1) #Flattening Mask
target = target[~mask] #Masking Target
n, c, h, w = inp.size()
inp1=np.zeros((target.shape[0],c)) #Creating new empty array with dimensions of (masked_region, c)
inp1=torch.from_numpy(inp1)
for i in range( c):
inp1[:,i]=inp[0,i,:,:].view(-1,1)[~mask] #Masking the input and filling in the array created
log_p = F.log_softmax(inp1, dim=1)
criterion=nn.NLLLoss()
loss = criterion(log_p, target)
return loss

最佳答案

假设您的 inptarget 变量都是表示图像的张量,我不明白为什么您需要应用 log_softmax 以及为什么您会这样做使用 NLLLoss 作为损失函数。

尝试废弃 softmax 并使用 MSELoss 作为损失函数,以下是使用您的代码的示例:

def Loss(inp, target, mask):
mask=torch.from_numpy(np.array(mask, dtype=np.uint8))
target=target.contiguous().view(-1,1) #Flattening the Target Image
mask = mask.contiguous().view(-1, 1) #Flattening Mask
target = target[~mask] #Masking Target
n, c, h, w = inp.size()
inp1=np.zeros((target.shape[0],c)) #Creating new empty array with dimensions of (masked_region, c)
inp1=torch.from_numpy(inp1)
for i in range( c):
inp1[:,i]=inp[0,i,:,:].view(-1,1)[~mask] #Masking the input and filling in the array created
criterion=nn.MSELoss(reduction='sum')
loss = criterion(inp1, target)
return loss

关于python - 在 Pytorch 上实现 FCN 的损失函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56923703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com