summaryrefslogblamecommitdiff
path: root/htk_io/tools/nerv_to_tnet.lua
blob: c0ac76b19f41ab4558432eed4a1bf515c2a73b82 (plain) (tree)



























































                                                                                              
-- usage: nerv config_file nerv_param_input tnet_output

dofile(arg[1])
param_repo = nerv.ParamRepo()
param_repo:import({arg[2], gconf.initialized_param[2]}, nil, gconf)
layer_repo = make_layer_repo(param_repo)
f = assert(io.open(arg[3], "w"))

function print_tnet_matrix(cumat)
    local strs = {}
    collectgarbage()
    if cumat:nrow() == 1 then
        local mat = nerv.MMatrixFloat(1, cumat:ncol())
        cumat:copy_toh(mat)
        table.insert(strs, string.format("v %d\n", mat:ncol()))
        for j = 0, mat:ncol() - 1 do
            table.insert(strs, string.format("%.8f ", mat[0][j]))
        end
        table.insert(strs, "\n")
        f:write(table.concat(strs))
    else
        cumat = cumat:trans()
        local mat = nerv.MMatrixFloat(cumat:nrow(), cumat:ncol())
        cumat:copy_toh(mat)
        table.insert(strs, string.format("m %d %d\n", mat:nrow(), mat:ncol()))
        for i = 0, mat:nrow() - 1 do
            local row = mat[i]
            for j = 0, mat:ncol() - 1 do
                table.insert(strs, string.format("%.8f ", row[j]))
            end
            table.insert(strs, "\n")
            f:write(table.concat(strs))
            strs = {}
        end
    end
end
local lnames = {"affine0", "sigmoid0",
                "affine1", "sigmoid1",
                "affine2", "sigmoid2",
                "affine3", "sigmoid3",
                "affine4", "sigmoid4",
                "affine5", "sigmoid5",
                "affine6", "sigmoid6",
                "affine7", "ce_crit"}
for i, name in ipairs(lnames) do
    local layer = layer_repo:get_layer(name)
    local layer_type = layer.__typename
    if layer_type == "nerv.AffineLayer" then
        f:write(string.format("<biasedlinearity> %d %d\n", layer.dim_out[1], layer.dim_in[1]))
        print_tnet_matrix(layer.ltp.trans)
        print_tnet_matrix(layer.bp.trans)
    elseif layer_type == "nerv.SigmoidLayer" then
        f:write(string.format("<sigmoid> %d %d\n", layer.dim_out[1], layer.dim_in[1]))
    elseif layer_type == "nerv.SoftmaxCELayer" then
        f:write(string.format("<softmax> %d %d\n", layer.dim_in[1], layer.dim_in[1]))
    else
        nerv.error("unknown layer type %s", layer_type)
    end
end
f:close()