diff options
Diffstat (limited to 'nerv/examples')
-rw-r--r-- | nerv/examples/asr_trainer.lua | 71 | ||||
-rw-r--r-- | nerv/examples/swb_baseline.lua | 1 | ||||
-rw-r--r-- | nerv/examples/swb_baseline2.lua | 87 | ||||
-rw-r--r-- | nerv/examples/timit_baseline2.lua | 20 |
4 files changed, 98 insertions, 81 deletions
diff --git a/nerv/examples/asr_trainer.lua b/nerv/examples/asr_trainer.lua index 6bdf57c..645f1ef 100644 --- a/nerv/examples/asr_trainer.lua +++ b/nerv/examples/asr_trainer.lua @@ -22,9 +22,9 @@ local function build_trainer(ifname) local input_order = get_input_order() network = nerv.Network("nt", gconf, {network = network}) - network:init(gconf.batch_size, 1) + network:init(gconf.batch_size, gconf.chunk_size) global_transf = nerv.Network("gt", gconf, {network = global_transf}) - global_transf:init(gconf.batch_size, 1) + global_transf:init(gconf.batch_size, gconf.chunk_size) local iterative_trainer = function (prefix, scp_file, bp, rebind_param_repo) -- rebind the params if necessary @@ -39,11 +39,17 @@ local function build_trainer(ifname) local buffer = make_buffer(make_readers(scp_file, layer_repo)) -- initialize the network gconf.cnt = 0 - err_input = {mat_type(gconf.batch_size, 1)} - err_input[1]:fill(1) + local err_input = {{}} + local output = {{}} + for i = 1, gconf.chunk_size do + local mini_batch = mat_type(gconf.batch_size, 1) + mini_batch:fill(1) + table.insert(err_input[1], mini_batch) + table.insert(output[1], mat_type(gconf.batch_size, 1)) + end network:epoch_init() global_transf:epoch_init() - for data in buffer.get_data, buffer do + for d in buffer.get_data, buffer do -- prine stat periodically gconf.cnt = gconf.cnt + 1 if gconf.cnt == 1000 then @@ -54,35 +60,39 @@ local function build_trainer(ifname) -- break end local input = {} + local err_output = {} -- if gconf.cnt == 1000 then break end for i, e in ipairs(input_order) do local id = e.id - if data[id] == nil then + if d.data[id] == nil then nerv.error("input data %s not found", id) end - local transformed + local transformed = {} + local err_output_i = {} if e.global_transf then - transformed = nerv.speech_utils.global_transf(data[id], - global_transf, - gconf.frm_ext or 0, 0, - gconf) + for _, mini_batch in ipairs(d.data[id]) do + table.insert(transformed, + nerv.speech_utils.global_transf(mini_batch, + global_transf, + gconf.frm_ext or 0, 0, + gconf)) + end else - transformed = data[id] + transformed = d.data[id] + end + for _, mini_batch in ipairs(transformed) do + table.insert(err_output_i, mini_batch:create()) end + table.insert(err_output, err_output_i) table.insert(input, transformed) end - local output = {mat_type(gconf.batch_size, 1)} - err_output = {} - for i = 1, #input do - table.insert(err_output, input[i]:create()) - end - network:mini_batch_init({seq_length = table.vector(gconf.batch_size, 1), - new_seq = {}, + network:mini_batch_init({seq_length = d.seq_length, + new_seq = d.new_seq, do_train = bp, - input = {input}, - output = {output}, - err_input = {err_input}, - err_output = {err_output}}) + input = input, + output = output, + err_input = err_input, + err_output = err_output}) network:propagate() if bp then network:back_propagate() @@ -111,19 +121,21 @@ end local function check_and_add_defaults(spec, opts) local function get_opt_val(k) - return opts[string.gsub(k, '_', '-')].val + local k = string.gsub(k, '_', '-') + return opts[k].val, opts[k].specified end local opt_v = get_opt_val("resume_from") if opt_v then + nerv.info("resuming from previous training state") gconf = dofile(opt_v) else for k, v in pairs(spec) do - local opt_v = get_opt_val(k) - if opt_v ~= nil then + local opt_v, specified = get_opt_val(k) + if (not specified) and gconf[k] ~= nil then + nerv.info("using setting in network config file: %s = %s", k, gconf[k]) + elseif opt_v ~= nil then + nerv.info("using setting in options: %s = %s", k, opt_v) gconf[k] = opt_v - elseif gconf[k] ~= nil then - elseif v ~= nil then - gconf[k] = v end end end @@ -168,6 +180,7 @@ end local trainer_defaults = { lrate = 0.8, batch_size = 256, + chunk_size = 1, buffer_size = 81920, wcost = 1e-6, momentum = 0.9, diff --git a/nerv/examples/swb_baseline.lua b/nerv/examples/swb_baseline.lua index 0ce8468..ece4d44 100644 --- a/nerv/examples/swb_baseline.lua +++ b/nerv/examples/swb_baseline.lua @@ -171,6 +171,7 @@ function make_buffer(readers) { buffer_size = gconf.buffer_size, batch_size = gconf.batch_size, + chunk_size = gconf.chunk_size, randomize = gconf.randomize, readers = readers, use_gpu = true diff --git a/nerv/examples/swb_baseline2.lua b/nerv/examples/swb_baseline2.lua index 8b5ebb1..38cfb9a 100644 --- a/nerv/examples/swb_baseline2.lua +++ b/nerv/examples/swb_baseline2.lua @@ -1,13 +1,13 @@ require 'htk_io' -gconf = {lrate = 0.8, wcost = 1e-6, momentum = 0.9, +gconf = {lrate = 0.8, wcost = 1e-6, momentum = 0.9, frm_ext = 5, rearrange = true, -- just to make the context order consistent with old results, deprecated - frm_ext = 5, frm_trim = 5, -- trim the first and last 5 frames, TNet just does this, deprecated tr_scp = "/speechlab/users/mfy43/swb50/train_bp.scp", cv_scp = "/speechlab/users/mfy43/swb50/train_cv.scp", htk_conf = "/speechlab/users/mfy43/swb50/plp_0_d_a.conf", initialized_param = {"/speechlab/users/mfy43/swb50/swb_init.nerv", - "/speechlab/users/mfy43/swb50/swb_global_transf.nerv"}} + "/speechlab/users/mfy43/swb50/swb_global_transf.nerv"}, + chunk_size = 1} function make_layer_repo(param_repo) local layer_repo = nerv.LayerRepo( @@ -15,13 +15,13 @@ function make_layer_repo(param_repo) -- global transf ["nerv.BiasLayer"] = { - blayer1 = {dim_in = {429}, dim_out = {429}, params = {bias = "bias1"}}, - blayer2 = {dim_in = {429}, dim_out = {429}, params = {bias = "bias2"}} + blayer1 = {dim_in = {429}, dim_out = {429}, params = {bias = "bias0"}}, + blayer2 = {dim_in = {429}, dim_out = {429}, params = {bias = "bias1"}} }, ["nerv.WindowLayer"] = { - wlayer1 = {dim_in = {429}, dim_out = {429}, params = {window = "window1"}}, - wlayer2 = {dim_in = {429}, dim_out = {429}, params = {window = "window2"}} + wlayer1 = {dim_in = {429}, dim_out = {429}, params = {window = "window0"}}, + wlayer2 = {dim_in = {429}, dim_out = {429}, params = {window = "window1"}} }, -- biased linearity ["nerv.AffineLayer"] = @@ -65,39 +65,39 @@ function make_layer_repo(param_repo) layer_repo:add_layers( { - ["nerv.DAGLayer"] = + ["nerv.GraphLayer"] = { global_transf = { dim_in = {429}, dim_out = {429}, - sub_layers = layer_repo, + layer_repo = layer_repo, connections = { - ["<input>[1]"] = "blayer1[1]", - ["blayer1[1]"] = "wlayer1[1]", - ["wlayer1[1]"] = "blayer2[1]", - ["blayer2[1]"] = "wlayer2[1]", - ["wlayer2[1]"] = "<output>[1]" + {"<input>[1]", "blayer1[1]", 0}, + {"blayer1[1]", "wlayer1[1]", 0}, + {"wlayer1[1]", "blayer2[1]", 0}, + {"blayer2[1]", "wlayer2[1]", 0}, + {"wlayer2[1]", "<output>[1]", 0} } }, main = { dim_in = {429}, dim_out = {3001}, - sub_layers = layer_repo, + layer_repo = layer_repo, connections = { - ["<input>[1]"] = "affine0[1]", - ["affine0[1]"] = "sigmoid0[1]", - ["sigmoid0[1]"] = "affine1[1]", - ["affine1[1]"] = "sigmoid1[1]", - ["sigmoid1[1]"] = "affine2[1]", - ["affine2[1]"] = "sigmoid2[1]", - ["sigmoid2[1]"] = "affine3[1]", - ["affine3[1]"] = "sigmoid3[1]", - ["sigmoid3[1]"] = "affine4[1]", - ["affine4[1]"] = "sigmoid4[1]", - ["sigmoid4[1]"] = "affine5[1]", - ["affine5[1]"] = "sigmoid5[1]", - ["sigmoid5[1]"] = "affine6[1]", - ["affine6[1]"] = "sigmoid6[1]", - ["sigmoid6[1]"] = "affine7[1]", - ["affine7[1]"] = "<output>[1]" + {"<input>[1]", "affine0[1]", 0}, + {"affine0[1]", "sigmoid0[1]", 0}, + {"sigmoid0[1]", "affine1[1]", 0}, + {"affine1[1]", "sigmoid1[1]", 0}, + {"sigmoid1[1]", "affine2[1]", 0}, + {"affine2[1]", "sigmoid2[1]", 0}, + {"sigmoid2[1]", "affine3[1]", 0}, + {"affine3[1]", "sigmoid3[1]", 0}, + {"sigmoid3[1]", "affine4[1]", 0}, + {"affine4[1]", "sigmoid4[1]", 0}, + {"sigmoid4[1]", "affine5[1]", 0}, + {"affine5[1]", "sigmoid5[1]", 0}, + {"sigmoid5[1]", "affine6[1]", 0}, + {"affine6[1]", "sigmoid6[1]", 0}, + {"sigmoid6[1]", "affine7[1]", 0}, + {"affine7[1]", "<output>[1]", 0} } } } @@ -105,25 +105,25 @@ function make_layer_repo(param_repo) layer_repo:add_layers( { - ["nerv.DAGLayer"] = + ["nerv.GraphLayer"] = { ce_output = { dim_in = {429, 1}, dim_out = {1}, - sub_layers = layer_repo, + layer_repo = layer_repo, connections = { - ["<input>[1]"] = "main[1]", - ["main[1]"] = "ce_crit[1]", - ["<input>[2]"] = "ce_crit[2]", - ["ce_crit[1]"] = "<output>[1]" + {"<input>[1]", "main[1]", 0}, + {"main[1]", "ce_crit[1]", 0}, + {"<input>[2]", "ce_crit[2]", 0}, + {"ce_crit[1]", "<output>[1]", 0} } }, softmax_output = { dim_in = {429}, dim_out = {3001}, - sub_layers = layer_repo, + layer_repo = layer_repo, connections = { - ["<input>[1]"] = "main[1]", - ["main[1]"] = "softmax[1]", - ["softmax[1]"] = "<output>[1]" + {"<input>[1]", "main[1]", 0}, + {"main[1]", "softmax[1]", 0}, + {"softmax[1]", "<output>[1]", 0} } } } @@ -146,7 +146,7 @@ end function make_readers(scp_file, layer_repo) return { - {reader = nerv.TNetReader(gconf, + {reader = nerv.HTKReader(gconf, { id = "main_scp", scp_file = scp_file, @@ -167,10 +167,11 @@ function make_readers(scp_file, layer_repo) end function make_buffer(readers) - return nerv.SGDBuffer(gconf, + return nerv.FrmBuffer(gconf, { buffer_size = gconf.buffer_size, batch_size = gconf.batch_size, + chunk_size = gconf.chunk_size, randomize = gconf.randomize, readers = readers, use_gpu = true diff --git a/nerv/examples/timit_baseline2.lua b/nerv/examples/timit_baseline2.lua index d783c3d..658aa2e 100644 --- a/nerv/examples/timit_baseline2.lua +++ b/nerv/examples/timit_baseline2.lua @@ -1,14 +1,15 @@ require 'kaldi_io' gconf = {lrate = 0.8, wcost = 1e-6, momentum = 0.9, frm_ext = 5, tr_scp = "ark:/speechlab/tools/KALDI/kaldi-master/src/featbin/copy-feats " .. - "scp:/speechlab/users/mfy43/timit/s5/exp/dnn4_nerv_prepare/train.scp ark:- |", + "scp:/speechlab/users/mfy43/timit/s5/exp/dnn4_nerv_dnn/train.scp ark:- |", cv_scp = "ark:/speechlab/tools/KALDI/kaldi-master/src/featbin/copy-feats " .. - "scp:/speechlab/users/mfy43/timit/s5/exp/dnn4_nerv_prepare/cv.scp ark:- |", - initialized_param = {"/speechlab/users/mfy43/timit/s5/exp/dnn4_nerv_prepare/nnet_init.nerv", - "/speechlab/users/mfy43/timit/s5/exp/dnn4_nerv_prepare/nnet_output.nerv", - "/speechlab/users/mfy43/timit/s5/exp/dnn4_nerv_prepare/nnet_trans.nerv"}, - decode_param = {"/speechlab/users/mfy43/timit/nnet_init_20160229015745_iter_13_lr0.013437_tr72.434_cv58.729.nerv", - "/speechlab/users/mfy43/timit/s5/exp/dnn4_nerv_prepare/nnet_trans.nerv"}} + "scp:/speechlab/users/mfy43/timit/s5/exp/dnn4_nerv_dnn/cv.scp ark:- |", + initialized_param = {"/speechlab/users/mfy43/timit/s5/exp/dnn4_nerv_dnn/nnet_init.nerv", + "/speechlab/users/mfy43/timit/s5/exp/dnn4_nerv_dnn/nnet_output.nerv", + "/speechlab/users/mfy43/timit/s5/exp/dnn4_nerv_dnn/nnet_trans.nerv"}, + -- params in nnet_trans.nerv are included in the trained model + decode_param = {"/speechlab/users/mfy43/timit/s5/nerv_20160311205342/nnet_init_20160311211609_iter_13_lr0.013437_tr72.572_cv58.709.nerv"}, + chunk_size = 1} function make_layer_repo(param_repo) local layer_repo = nerv.LayerRepo( @@ -113,7 +114,7 @@ function make_layer_repo(param_repo) dim_in = {440}, dim_out = {1959}, layer_repo = layer_repo, connections = { - {"<input>[1]", "main[1]", 0}, + {"<input>[1]", "main[1]", 0}, {"main[1]", "softmax[1]", 0}, {"softmax[1]", "<output>[1]", 0} } @@ -176,10 +177,11 @@ function make_decode_readers(scp_file, layer_repo) end function make_buffer(readers) - return nerv.SGDBuffer(gconf, + return nerv.FrmBuffer(gconf, { buffer_size = gconf.buffer_size, batch_size = gconf.batch_size, + chunk_size = gconf.chunk_size, randomize = gconf.randomize, readers = readers, use_gpu = true |