将我的自定义损失函数添加到火炬
Add my custom loss function to torch
我想给 torch 添加一个损失函数来计算预测值和目标值之间的编辑距离。
有没有简单的方法来实现这个想法?
还是我必须自己编写 class 具有后退和前进功能?
如果您的标准可以表示为现有模块和标准的组合,则最好使用容器简单地构建此类组合。唯一的问题是标准容器仅设计用于模块,而不是标准。不同之处在于 :forward
方法签名:
module:forward(input)
criterion:forward(input, target)
幸运的是,我们可以自由定义自己的容器,它也可以使用标准。例如,顺序:
local GeneralizedSequential, _ = torch.class('nn.GeneralizedSequential', 'nn.Sequential')
function GeneralizedSequential:forward(input, target)
return self:updateOutput(input, target)
end
function GeneralizedSequential:updateOutput(input, target)
local currentOutput = input
for i=1,#self.modules do
currentOutput = self.modules[i]:updateOutput(currentOutput, target)
end
self.output = currentOutput
return currentOutput
end
下面是如何实现 nn.CrossEntropyCriterion
具有此通用顺序容器的说明:
function MyCrossEntropyCriterion(weights)
criterion = nn.GeneralizedSequential()
criterion:add(nn.LogSoftMax())
criterion:add(nn.ClassNLLCriterion(weights))
return criterion
end
检查是否一切正确:
output = torch.rand(3,3)
target = torch.Tensor({1, 2, 3})
mycrit = MyCrossEntropyCriterion()
-- print(mycrit)
print(mycrit:forward(output, target))
print(mycrit:backward(output, target))
crit = nn.CrossEntropyCriterion()
-- print(crit)
print(crit:forward(output, target))
print(crit:backward(output, target))
为了补充已接受的答案,您必须注意您定义的损失函数(在您的情况下编辑距离)相对于网络参数是可微的。
我想给 torch 添加一个损失函数来计算预测值和目标值之间的编辑距离。 有没有简单的方法来实现这个想法? 还是我必须自己编写 class 具有后退和前进功能?
如果您的标准可以表示为现有模块和标准的组合,则最好使用容器简单地构建此类组合。唯一的问题是标准容器仅设计用于模块,而不是标准。不同之处在于 :forward
方法签名:
module:forward(input)
criterion:forward(input, target)
幸运的是,我们可以自由定义自己的容器,它也可以使用标准。例如,顺序:
local GeneralizedSequential, _ = torch.class('nn.GeneralizedSequential', 'nn.Sequential')
function GeneralizedSequential:forward(input, target)
return self:updateOutput(input, target)
end
function GeneralizedSequential:updateOutput(input, target)
local currentOutput = input
for i=1,#self.modules do
currentOutput = self.modules[i]:updateOutput(currentOutput, target)
end
self.output = currentOutput
return currentOutput
end
下面是如何实现 nn.CrossEntropyCriterion
具有此通用顺序容器的说明:
function MyCrossEntropyCriterion(weights)
criterion = nn.GeneralizedSequential()
criterion:add(nn.LogSoftMax())
criterion:add(nn.ClassNLLCriterion(weights))
return criterion
end
检查是否一切正确:
output = torch.rand(3,3)
target = torch.Tensor({1, 2, 3})
mycrit = MyCrossEntropyCriterion()
-- print(mycrit)
print(mycrit:forward(output, target))
print(mycrit:backward(output, target))
crit = nn.CrossEntropyCriterion()
-- print(crit)
print(crit:forward(output, target))
print(crit:backward(output, target))
为了补充已接受的答案,您必须注意您定义的损失函数(在您的情况下编辑距离)相对于网络参数是可微的。