-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtrain.lua
85 lines (66 loc) · 2.22 KB
/
train.lua
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
require "nn"
require "optim"
-- Data
local data = torch.load("data/data.t7")
local train_dataset = data["train"]
local test_dataset = data["test"]
local voc_size = #(data["word_decoder"])
local chunk_size = #(data["pos_decoder"])
local context_size = data["padding_size"]*2 + 1
local dimension = 10
local train_inputs = train_dataset[{{},{1,context_size}}]
local train_target = train_dataset[{{},{context_size+2}}]:select(2,1)
local test_inputs = test_dataset[{{},{1,context_size}}]
local test_target = test_dataset[{{},{context_size+2}}]:select(2,1)
-- Model
local model = nn.Sequential()
model:add(nn.LookupTable(voc_size,dimension))
model:add(nn.Reshape(dimension * context_size))
model:add(nn.Linear(dimension * context_size,30))
model:add(nn.ReLU())
model:add(nn.Linear(30,chunk_size))
model:add(nn.LogSoftMax())
local criterion = nn.ClassNLLCriterion()
local param, grad = model:getParameters()
param:uniform(-0.1, 0.1)
-- Train
local batch_size = 100
local epoch = 0
local config = {LearningRate = 0.01, Mormentum=0.9}
function train()
epoch = (epoch or 0) + 1
print("epoch"..epoch)
for j = 1,train_inputs:size(1)-batch_size,batch_size do
local batch_data = train_inputs[{{j,j+batch_size-1},{}}]
local batch_labels = train_target[{{j,j+batch_size-1}}]
local function feval(new_param)
if param ~= new_param then
param:copy(new_param)
end
grad:zero()
local output = model:forward(batch_data)
local loss = criterion:forward(output,batch_labels)
local dldo = criterion:backward(output,batch_labels)
model:backward(batch_data,dldo)
return loss, grad
end
optim.sgd(feval,param,config)
end
end
-- Test
function test()
max_values,predictions = model:forward(test_inputs):max(2)
err = 0
predictions = predictions:byte()
for i = 1,test_target:size(1) do
if predictions[i][1]~= test_target[i] then
err = err +1
end
end
print("Precision: "..(test_target:size(1) - err )/test_target:size(1) )
end
for i=1,500 do
train()
test()
end
torch.save("data/model.t7",model)