Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/torch/nn.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsoumith <soumith@fb.com>2015-01-03 07:34:54 +0300
committersoumith <soumith@fb.com>2015-01-03 07:34:54 +0300
commit5409d93ef4cc712868e94b3015df97151bcabc22 (patch)
tree3ac14c7b3d64758979a8953b1334ced52d449c40 /Jacobian.lua
parent5b43a59a9cb9f51954352ac478901c7cfcd8a1bc (diff)
added optional precision parameter to nn.Jacobian
Diffstat (limited to 'Jacobian.lua')
-rw-r--r--Jacobian.lua52
1 files changed, 27 insertions, 25 deletions
diff --git a/Jacobian.lua b/Jacobian.lua
index c3797bd..25e8cf0 100644
--- a/Jacobian.lua
+++ b/Jacobian.lua
@@ -64,53 +64,55 @@ function nn.Jacobian.backwardUpdate(module, input, param)
return jacobian
end
-function nn.Jacobian.forward(module, input, param)
+function nn.Jacobian.forward(module, input, param, perturbation)
param = param or input
-- perturbation amount
- local small = 1e-6
+ perturbation = perturbation or 1e-6
-- 1D view of input
--local tst = param:storage()
local sin = param.new(param):resize(param:nElement())--param.new(tst,1,tst:size())
-- jacobian matrix to calculate
local jacobian = torch.Tensor():resize(param:nElement(),module:forward(input):nElement())
-
+
local outa = torch.Tensor(jacobian:size(2))
local outb = torch.Tensor(jacobian:size(2))
-
- for i=1,sin:nElement() do
- sin[i] = sin[i] - small
+
+ for i=1,sin:nElement() do
+ local orig = sin[i]
+ sin[i] = orig - perturbation
outa:copy(module:forward(input))
- sin[i] = sin[i] + 2*small
+ sin[i] = orig + perturbation
outb:copy(module:forward(input))
- sin[i] = sin[i] - small
+ sin[i] = orig
- outb:add(-1,outa):div(2*small)
+ outb:add(-1,outa):div(2*perturbation)
jacobian:select(1,i):copy(outb)
end
return jacobian
end
-function nn.Jacobian.forwardUpdate(module, input, param)
+function nn.Jacobian.forwardUpdate(module, input, param, perturbation)
-- perturbation amount
- local small = 1e-6
+ perturbation = perturbation or 1e-6
-- 1D view of input
--local tst = param:storage()
local sin = param.new(param):resize(param:nElement())--param.new(tst,1,tst:size())
-- jacobian matrix to calculate
local jacobian = torch.Tensor():resize(param:nElement(),module:forward(input):nElement())
-
+
local outa = torch.Tensor(jacobian:size(2))
local outb = torch.Tensor(jacobian:size(2))
-
- for i=1,sin:nElement() do
- sin[i] = sin[i] - small
+
+ for i=1,sin:nElement() do
+ local orig = sin[i]
+ sin[i] = orig - perturbation
outa:copy(module:forward(input))
- sin[i] = sin[i] + 2*small
+ sin[i] = orig + perturbation
outb:copy(module:forward(input))
- sin[i] = sin[i] - small
+ sin[i] = orig
- outb:add(-1,outa):div(2*small)
+ outb:add(-1,outa):div(2*perturbation)
jacobian:select(1,i):copy(outb)
jacobian:select(1,i):mul(-1)
jacobian:select(1,i):add(sin[i])
@@ -118,37 +120,37 @@ function nn.Jacobian.forwardUpdate(module, input, param)
return jacobian
end
-function nn.Jacobian.testJacobian (module, input, minval, maxval)
+function nn.Jacobian.testJacobian(module, input, minval, maxval, perturbation)
minval = minval or -2
maxval = maxval or 2
local inrange = maxval - minval
input:copy(torch.rand(input:nElement()):mul(inrange):add(minval))
- local jac_fprop = nn.Jacobian.forward(module,input)
- local jac_bprop = nn.Jacobian.backward(module,input)
+ local jac_fprop = nn.Jacobian.forward(module, input, input, perturbation)
+ local jac_bprop = nn.Jacobian.backward(module, input)
local error = jac_fprop-jac_bprop
return error:abs():max()
end
-function nn.Jacobian.testJacobianParameters (module, input, param, dparam, minval, maxval)
+function nn.Jacobian.testJacobianParameters(module, input, param, dparam, minval, maxval, perturbation)
minval = minval or -2
maxval = maxval or 2
local inrange = maxval - minval
input:copy(torch.rand(input:nElement()):mul(inrange):add(minval))
param:copy(torch.rand(param:nElement()):mul(inrange):add(minval))
local jac_bprop = nn.Jacobian.backward(module, input, param, dparam)
- local jac_fprop = nn.Jacobian.forward(module, input, param)
+ local jac_fprop = nn.Jacobian.forward(module, input, param, perturbation)
local error = jac_fprop - jac_bprop
return error:abs():max()
end
-function nn.Jacobian.testJacobianUpdateParameters (module, input, param, minval, maxval)
+function nn.Jacobian.testJacobianUpdateParameters(module, input, param, minval, maxval, perturbation)
minval = minval or -2
maxval = maxval or 2
local inrange = maxval - minval
input:copy(torch.rand(input:nElement()):mul(inrange):add(minval))
param:copy(torch.rand(param:nElement()):mul(inrange):add(minval))
local params_bprop = nn.Jacobian.backwardUpdate(module, input, param)
- local params_fprop = nn.Jacobian.forwardUpdate(module, input, param)
+ local params_fprop = nn.Jacobian.forwardUpdate(module, input, param, perturbation)
local error = params_fprop - params_bprop
return error:abs():max()