From 0752b3b710a5f29fba7f7d5e595aa9da3a76fdda Mon Sep 17 00:00:00 2001 From: Luo Tao Date: Mon, 14 Nov 2016 14:08:29 +0800 Subject: [PATCH 1/2] add layer check for recurrent_group --- .../paddle/trainer_config_helpers/layers.py | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/python/paddle/trainer_config_helpers/layers.py b/python/paddle/trainer_config_helpers/layers.py index 796121a64136ee..952b1f097133c6 100644 --- a/python/paddle/trainer_config_helpers/layers.py +++ b/python/paddle/trainer_config_helpers/layers.py @@ -2754,7 +2754,12 @@ def __init__(self, input): @wrap_name_default("recurrent_group") -def recurrent_group(step, input, reverse=False, name=None, targetInlink=None): +def recurrent_group(step, + input, + reverse=False, + name=None, + targetInlink=None, + is_train=True): """ Recurrent layer group is an extremely flexible recurrent unit in PaddlePaddle. As long as the user defines the calculation done within a @@ -2819,6 +2824,12 @@ def step(input): :type targetInlink: LayerOutput|SubsequenceInput + :param is_train: recurrent_group is used for training (True) or generating (False). + If is training, one of the input type must be LayerOutput; else, + none of input type should be LayerOutput. + + : type is_train: bool + :return: LayerOutput object. :rtype: LayerOutput """ @@ -2866,6 +2877,7 @@ def map_in_links(x): seq_reversed=reverse, target_inlinkname=targetInlinkName) in_args = [] + has_LayerOutput = True for each_input in input: assert is_single_input(each_input) if isinstance(each_input, LayerOutput): @@ -2873,6 +2885,7 @@ def map_in_links(x): elif isinstance(each_input, SubsequenceInput): in_args.append(each_input.input) else: + has_LayerOutput = False mem_name = "__%s_memory__" % each_input.input.name mem = memory( name=mem_name, @@ -2886,6 +2899,8 @@ def map_in_links(x): mix += identity_projection(mem) in_args.append(mem) + assert (is_train == has_LayerOutput) + layer_outs = step(*in_args) if isinstance(layer_outs, LayerOutput): @@ -3177,7 +3192,11 @@ def __real_step__(*args): return predict tmp = recurrent_group( - step=__real_step__, input=real_input, reverse=False, name=name) + step=__real_step__, + input=real_input, + reverse=False, + name=name, + is_train=False) return tmp From 8c59437612280738f59df859d9f512b318153d05 Mon Sep 17 00:00:00 2001 From: Luo Tao Date: Tue, 15 Nov 2016 12:35:36 +0800 Subject: [PATCH 2/2] change is_train to is_generating --- python/paddle/trainer_config_helpers/layers.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/python/paddle/trainer_config_helpers/layers.py b/python/paddle/trainer_config_helpers/layers.py index f0757b9ce21fc1..7cd290023aba10 100644 --- a/python/paddle/trainer_config_helpers/layers.py +++ b/python/paddle/trainer_config_helpers/layers.py @@ -494,8 +494,7 @@ def scaling_projection(input, param_attr=None): :return: A ScalingProjection object :rtype: ScalingProjection """ - proj = ScalingProjection(input_layer_name=input.name, - **param_attr.attr) + proj = ScalingProjection(input_layer_name=input.name, **param_attr.attr) proj.origin = input return proj @@ -2788,7 +2787,7 @@ def recurrent_group(step, reverse=False, name=None, targetInlink=None, - is_train=True): + is_generating=False): """ Recurrent layer group is an extremely flexible recurrent unit in PaddlePaddle. As long as the user defines the calculation done within a @@ -2853,11 +2852,11 @@ def step(input): :type targetInlink: LayerOutput|SubsequenceInput - :param is_train: recurrent_group is used for training (True) or generating (False). - If is training, one of the input type must be LayerOutput; else, - none of input type should be LayerOutput. + :param is_generating: If is generating, none of input type should be LayerOutput; + else, for training or testing, one of the input type must + be LayerOutput. - : type is_train: bool + : type is_generating: bool :return: LayerOutput object. :rtype: LayerOutput @@ -2928,7 +2927,7 @@ def map_in_links(x): mix += identity_projection(mem) in_args.append(mem) - assert (is_train == has_LayerOutput) + assert (is_generating != has_LayerOutput) layer_outs = step(*in_args) @@ -3225,7 +3224,7 @@ def __real_step__(*args): input=real_input, reverse=False, name=name, - is_train=False) + is_generating=True) return tmp