From 0ba71d923cc056cccc33cfb111c6f7460a1671de Mon Sep 17 00:00:00 2001 From: Yibing Liu Date: Tue, 13 Mar 2018 02:44:18 -0700 Subject: [PATCH] Add script for inference by using checkpoint --- fluid/DeepASR/infer_from_ckpt.py | 158 +++++++++++++++++++++++++++++++ fluid/DeepASR/train.py | 8 +- 2 files changed, 161 insertions(+), 5 deletions(-) create mode 100644 fluid/DeepASR/infer_from_ckpt.py diff --git a/fluid/DeepASR/infer_from_ckpt.py b/fluid/DeepASR/infer_from_ckpt.py new file mode 100644 index 00000000..dafb53fd --- /dev/null +++ b/fluid/DeepASR/infer_from_ckpt.py @@ -0,0 +1,158 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import sys +import os +import numpy as np +import argparse +import time + +import paddle.fluid as fluid +import data_utils.augmentor.trans_mean_variance_norm as trans_mean_variance_norm +import data_utils.augmentor.trans_add_delta as trans_add_delta +import data_utils.augmentor.trans_splice as trans_splice +import data_utils.data_reader as reader +from data_utils.util import lodtensor_to_ndarray +from model_utils.model import stacked_lstmp_model + + +def parse_args(): + parser = argparse.ArgumentParser("Run inference by using checkpoint.") + parser.add_argument( + '--batch_size', + type=int, + default=32, + help='The sequence number of a batch data. (default: %(default)d)') + parser.add_argument( + '--minimum_batch_size', + type=int, + default=1, + help='The minimum sequence number of a batch data. ' + '(default: %(default)d)') + parser.add_argument( + '--stacked_num', + type=int, + default=5, + help='Number of lstmp layers to stack. (default: %(default)d)') + parser.add_argument( + '--proj_dim', + type=int, + default=512, + help='Project size of lstmp unit. (default: %(default)d)') + parser.add_argument( + '--hidden_dim', + type=int, + default=1024, + help='Hidden size of lstmp unit. (default: %(default)d)') + parser.add_argument( + '--learning_rate', + type=float, + default=0.00016, + help='Learning rate used to train. (default: %(default)f)') + parser.add_argument( + '--device', + type=str, + default='GPU', + choices=['CPU', 'GPU'], + help='The device type. (default: %(default)s)') + parser.add_argument( + '--parallel', action='store_true', help='If set, run in parallel.') + parser.add_argument( + '--mean_var', + type=str, + default='data/global_mean_var_search26kHr', + help="The path for feature's global mean and variance. " + "(default: %(default)s)") + parser.add_argument( + '--infer_feature_lst', + type=str, + default='data/infer_feature.lst', + help='The feature list path for inference. (default: %(default)s)') + parser.add_argument( + '--infer_label_lst', + type=str, + default='data/infer_label.lst', + help='The label list path for inference. (default: %(default)s)') + parser.add_argument( + '--checkpoint', + type=str, + default='./checkpoint', + help="Checkpoints. Do not save checkpoint if set to ''. (default: %(default)s)" + ) + args = parser.parse_args() + return args + + +def print_arguments(args): + print('----------- Configuration Arguments -----------') + for arg, value in sorted(vars(args).iteritems()): + print('%s: %s' % (arg, value)) + print('------------------------------------------------') + + +def infer_from_ckpt(args): + """inference by using checkpoint. + """ + + if not os.path.exists(args.checkpoint): + raise IOError("Invalid checkpoint!") + + prediction, avg_cost, accuracy = stacked_lstmp_model( + hidden_dim=args.hidden_dim, + proj_dim=args.proj_dim, + stacked_num=args.stacked_num, + class_num=1749, + parallel=args.parallel) + + infer_program = fluid.default_main_program().clone() + + optimizer = fluid.optimizer.Adam(learning_rate=args.learning_rate) + optimizer.minimize(avg_cost) + + place = fluid.CPUPlace() if args.device == 'CPU' else fluid.CUDAPlace(0) + exe = fluid.Executor(place) + exe.run(fluid.default_startup_program()) + + # load checkpoint. + fluid.io.load_persistables(exe, args.checkpoint) + + ltrans = [ + trans_add_delta.TransAddDelta(2, 2), + trans_mean_variance_norm.TransMeanVarianceNorm(args.mean_var), + trans_splice.TransSplice() + ] + + feature_t = fluid.LoDTensor() + label_t = fluid.LoDTensor() + + # infer data reader + infer_data_reader = reader.DataReader(args.infer_feature_lst, + args.infer_label_lst) + infer_data_reader.set_transformers(ltrans) + infer_costs, infer_accs = [], [] + for batch_id, batch_data in enumerate( + infer_data_reader.batch_iterator(args.batch_size, + args.minimum_batch_size)): + # load_data + (features, labels, lod) = batch_data + feature_t.set(features, place) + feature_t.set_lod([lod]) + label_t.set(labels, place) + label_t.set_lod([lod]) + + cost, acc = exe.run(infer_program, + feed={"feature": feature_t, + "label": label_t}, + fetch_list=[avg_cost, accuracy], + return_numpy=False) + infer_costs.append(lodtensor_to_ndarray(cost)[0]) + infer_accs.append(lodtensor_to_ndarray(acc)[0]) + print(np.mean(infer_costs), np.mean(infer_accs)) + + +if __name__ == '__main__': + args = parse_args() + print_arguments(args) + + infer_from_ckpt(args) diff --git a/fluid/DeepASR/train.py b/fluid/DeepASR/train.py index 70739e05..8297ab74 100644 --- a/fluid/DeepASR/train.py +++ b/fluid/DeepASR/train.py @@ -143,13 +143,11 @@ def train(args): class_num=1749, parallel=args.parallel) - optimizer = fluid.optimizer.Adam(learning_rate=args.learning_rate) - optimizer.minimize(avg_cost) - # program for test test_program = fluid.default_main_program().clone() - with fluid.program_guard(test_program): - test_program = fluid.io.get_inference_program([avg_cost, accuracy]) + + optimizer = fluid.optimizer.Adam(learning_rate=args.learning_rate) + optimizer.minimize(avg_cost) place = fluid.CPUPlace() if args.device == 'CPU' else fluid.CUDAPlace(0) exe = fluid.Executor(place) -- GitLab