L1Criterion.lua 907 B

123456789101112131415161718192021222324252627
  1. -- ref: https://en.wikipedia.org/wiki/L1_loss
  2. local L1Criterion, parent = torch.class('w2nn.L1Criterion','nn.Criterion')
  3. function L1Criterion:__init()
  4. parent.__init(self)
  5. self.diff = torch.Tensor()
  6. self.linear_loss_buff = torch.Tensor()
  7. end
  8. function L1Criterion:updateOutput(input, target)
  9. self.diff:resizeAs(input):copy(input)
  10. if input:dim() == 1 then
  11. self.diff[1] = input[1] - target
  12. else
  13. for i = 1, input:size(1) do
  14. self.diff[i]:add(-1, target[i])
  15. end
  16. end
  17. local linear_targets = self.diff
  18. local linear_loss = self.linear_loss_buff:resizeAs(linear_targets):copy(linear_targets):abs():sum()
  19. self.output = (linear_loss) / input:nElement()
  20. return self.output
  21. end
  22. function L1Criterion:updateGradInput(input, target)
  23. local norm = 1.0 / input:nElement()
  24. self.gradInput:resizeAs(self.diff):copy(self.diff):sign():mul(norm)
  25. return self.gradInput
  26. end