d = nn.CMulTable()
e = nn.Linear(15, 15)
-model:addEdge(a, b)
-model:addEdge(b, nn.Linear(10, 15), nn.ReLU(), d)
-model:addEdge(b, c)
-model:addEdge(c, d)
-model:addEdge(c, nn.Mul(-1), e)
+model:connect(a, b)
+model:connect(b, nn.Linear(10, 15), nn.ReLU(), d)
+model:connect(b, c)
+model:connect(c, d)
+model:connect(c, nn.Mul(-1), e)
model:setInput(a)
model:setOutput({ d, e })
and run a forward pass with a random batch of 30 samples.
-Note that DAG:addEdge allows to add a bunch of edges at once. This is particularly useful to add anonymous modules which have a single predecessor and successor.
+Note that DAG:connect allows to add a bunch of edges at once. This is particularly useful to add anonymous modules which have a single predecessor and successor.
#Input and output#
-If a node has a single successor, its output is sent unchanged as input to that successor. If it has multiple successors, the outputs are collected into a table, and the table is used as input to the successor node. The indexes of the outputs in that table reflects the order in which they appear in the addEdge commands.
+If a node has a single successor, its output is sent unchanged as input to that successor. If it has multiple successors, the outputs are collected into a table, and the table is used as input to the successor node. The indexes of the outputs in that table reflects the order of the DAG:connect() commands.
The expected input (respectively the produced output) is a nested table of inputs reflecting the structure of the nested table of modules provided to DAG:setInput (respectively DAG:setOutput)
So for instance, in the example above, the model expects a tensor as input, since it is the input to the module a, and its output will is a table composed of two tensors, corresponding to the outputs of d and e respectively.
-*Francois Fleuret, Jan 12th, 2017*
+*Francois Fleuret, Jan 13th, 2017*
-- The main use should be to add an edge between two modules, but it
-- can also add a full sequence of modules
-function DAG:addEdge(...)
+function DAG:connect(...)
self.sorted = nil
local prev
for _, nnm in pairs({...}) do
end
end
--- +- Linear(10, 10) -> ReLU ---> d --+
--- / / \
--- / / \
--- --> a --> b -----------> c --------------+ e -->
--- \ /
--- \ /
--- +-- Mul(-1) --------+
+-- +-- Linear(10, 10) --> ReLU --> d --+
+-- / / \
+-- / / \
+-- --> a --> b -----------> c --------------+ e -->
+-- \ /
+-- \ /
+-- +----- Mul(-1) ------+
model = nn.DAG()
d = nn.CMulTable()
e = nn.CAddTable()
-model:addEdge(a, b)
-model:addEdge(b, nn.Linear(10, 15), nn.ReLU(), d)
-model:addEdge(d, e)
-model:addEdge(b, c)
-model:addEdge(c, d)
-model:addEdge(c, nn.Mul(-1), e)
+model:connect(a, b)
+model:connect(b, nn.Linear(10, 15), nn.ReLU(), d)
+model:connect(d, e)
+model:connect(b, c)
+model:connect(c, d)
+model:connect(c, nn.Mul(-1), e)
model:setInput(a)
model:setOutput(e)
print('Error = ' .. checkGrad(model, nn.MSECriterion(), input, output))
+print('Writing /tmp/graph.dot')
model:dot('/tmp/graph.dot')