-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathDNN.lua
More file actions
103 lines (90 loc) · 3.18 KB
/
DNN.lua
File metadata and controls
103 lines (90 loc) · 3.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
-- 29/07/16
--
local DNN = {}
function build_autoencoder(opt,vocab_size)
opt.useSeqLSTM = false
-- Encoder
local enc = nn.Sequential()
enc:add(nn.LookupTableMaskZero(vocab_size, opt.hiddensize))
enc.lstmLayers = {}
local inputsize = opt.hiddensize[1]
for i,hiddensize in ipairs(opt.hiddensize) do
if opt.useSeqLSTM then
enc.lstmLayers[i] = nn.SeqLSTM(inputsize, hiddensize)
enc.lstmLayers[i]:maskZero()
enc:add(enc.lstmLayers[i])
else
enc.lstmLayers[i] = nn.LSTM(opt.hiddensize, opt.hiddensize):maskZero(1)
enc:add(nn.Sequencer(enc.lstmLayers[i]))
end
end
enc:add(nn.Select(1, -1))
-- Decoder
local dec = nn.Sequential()
dec:add(nn.LookupTableMaskZero(opt.vocab_size, opt.hiddensize))
dec.lstmLayers = {}
for i,hiddensize in ipairs(opt.hiddensize) do
if opt.useSeqLSTM then
dec.lstmLayers[i] = nn.SeqLSTM(hiddensize, hiddensize)
dec.lstmLayers[i]:maskZero()
dec:add(dec.lstmLayers[i])
else
dec.lstmLayers[i] = nn.LSTM(hiddensize, hiddensize):maskZero(1)
dec:add(nn.Sequencer(dec.lstmLayers[i]))
end
end
dec:add(nn.Sequencer(nn.MaskZero(nn.Linear(hiddensize, vocab_size), 1)))
dec:add(nn.Sequencer(nn.MaskZero(nn.LogSoftMax(), 1)))
end
function DNN.build(opt,vocab_size)
local lm = nn.Sequential()
-- rnn layers
local stepmodule = nn.Sequential() -- applied at each time-step
local inputsize = opt.hiddensize[1]
for i,hiddensize in ipairs(opt.hiddensize) do
local rnn
if opt.lstm then -- Long Short Term Memory units
require 'nngraph'
nn.FastLSTM.usenngraph = true -- faster
rnn = nn.FastLSTM(inputsize, hiddensize)
stepmodule:add(rnn)
stepmodule:add(nn.Dropout(opt.dropout))
elseif opt.blstm then
rnn = nn.Sequencer(nn.FastLSTM(inputsize, hiddensize))--
lm:add(rnn)
lm:add(nn.Sequencer(nn.Dropout(opt.dropout)))
end
inputsize = hiddensize
end
if opt.blstm then
local bwd = lm:clone()
bwd:reset()
bwd:remember('neither')
local bwd_lstm = nn.BiSequencerLM(lm, bwd)
lm = nn.Sequential()
lm:add(bwd_lstm)
inputsize = inputsize*2
end
if opt.blstm then
lm:insert(nn.SplitTable(1),1) -- tensor to table of tensors TODO WHY???
else
lm:insert(nn.SplitTable(1),1)
end
if opt.dropout > 0 and not opt.gru then -- gru has a dropout option
lm:insert(nn.Dropout(opt.dropout),1)
end
-- input layer (i.e. word embedding space)
local lookup = nn.LookupTable(vocab_size, opt.hiddensize[1])
lookup.maxnormout = -1 -- prevent weird maxnormout behaviour
lm:insert(lookup,1) -- input is seqlen x batchsize
-- output layer
softmax = nn.Sequential()
softmax:add(nn.Linear(inputsize,vocab_size))
softmax:add(nn.LogSoftMax())
-- encapsulate stepmodule into a Sequencer
lm:add(nn.Sequencer(softmax))
-- remember previous state between batches
lm:remember((opt.lstm or opt.gru) and 'both' or 'eval')
return lm
end
return DNN