#Example#
-The typical use is:
+A typical use would be:
```Lua
model = nn.DAG()
a = nn.Linear(100, 10)
b = nn.ReLU()
c = nn.Linear(10, 15)
-d = nn.Linear(10, 15)
-e = nn.CMulTable()
-f = nn.Linear(15, 15)
+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(b, d)
-model:addEdge(c, e)
-model:addEdge(d, e)
-model:addEdge(d, f)
+model:addEdge(c, d)
+model:addEdge(c, nn.Mul(-1), e)
model:setInput(a)
-model:setOutput({ e, f })
+model:setOutput({ d, e })
-input = torch.Tensor(300, 100):uniform()
-output = model:updateOutput(input):clone()
+input = torch.Tensor(30, 100):uniform()
+output = model:updateOutput(input)
```
which would encode the following graph
- +--> c ----> e -->
- / /
- / /
- input --> a --> b ----> d ---+ output
- \
+ +- Linear(10, 10) -> ReLU ---> d -->
+ / /
+ / /
+ --> a --> b -----------> c --------------+
\
- +--> f -->
+ \
+ +-- Mul(-1) --> e -->
+
+and run a forward pass with a random batch of 30 samples.
+
+Note that DAG:addEdge
#Input and output#
end
end
-function DAG:addEdge(nnma, nnmb)
+-- 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(...)
self.sorted = nil
- self:createNode(nnma)
- self:createNode(nnmb)
- table.insert(self.node[nnmb].pred, nnma)
- table.insert(self.node[nnma].succ, nnmb)
+ local prev
+ for _, nnm in pairs({...}) do
+ self:createNode(nnm)
+ if prev then
+ table.insert(self.node[nnm].pred, prev)
+ table.insert(self.node[prev].succ, nnm)
+ end
+ prev = nnm
+ end
end
-- Apply f on t recursively; use the corresponding element from args
model = nn.DAG()
model:addEdge(a, b)
-model:addEdge(b, c)
+model:addEdge(b, nn.Linear(10, 5), nn.ReLU(), nn.Linear(5, 10), c)
model:addEdge(b, d)
model:addEdge(c, e)
model:addEdge(d, e)
model:addEdge(d, f)
model:addEdge(e, g)
-model:addEdge(f, g)
+model:addEdge(f, nn.Mul(-1), g)
model:setInput(a)
model:setOutput(g)