Skip to content

Commit

Permalink
add type compatible check for ParamAttr (PaddlePaddle#113)
Browse files Browse the repository at this point in the history
* add type compatible check for ParamAttr
  • Loading branch information
Haichao-Zhang authored and emailweixu committed Sep 24, 2016
1 parent 77ed98d commit 332194c
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 8 deletions.
52 changes: 46 additions & 6 deletions python/paddle/trainer_config_helpers/attrs.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,42 @@
'ExtraLayerAttribute']


def convert_and_compare(x, Type):
"""
Convert x to be the same type as Type and then convert back to
check whether there is a loss of information
:param x: object to be checked
:param Type: target type to check x over
"""
return type(x)(Type(x))==x

def is_compatible_with(x, Type):
"""
Check if x has a type compatible with Type
:param x: object to be checked
:param Type: target type to check x over
"""
if type(x) == Type:
return True
try:
if float == Type or int == Type:
# avoid those types that can be converted to float/int but not very
# meaningful and could potentially lead to error
# i.e., str and bool typed value should not be used for initializing float/int variable
if not isinstance(x, str) and not isinstance(x, bool):
return convert_and_compare(x, Type)
elif bool == Type:
# should not use string type to initialize bool variable
if not isinstance(x, str):
return convert_and_compare(x, Type)
else:
return False
except:
return False


class ParameterAttribute(object):
"""
Parameter Attributes object. To fine-tuning network training process, user
Expand Down Expand Up @@ -65,14 +101,18 @@ def __init__(self, name=None, is_static=False, initial_std=None,
elif initial_std is None and initial_mean is None and initial_max \
is None and initial_min is None:
self.attr = {'initial_smart': True}
elif isinstance(initial_std, float) or isinstance(initial_mean, float):
elif is_compatible_with(initial_std, float) or \
is_compatible_with(initial_mean, float):
self.attr = dict()
if initial_std is not None:
self.attr['initial_std'] = initial_std
if initial_mean is not None:
self.attr['initial_mean'] = initial_mean
self.attr['initial_strategy'] = 0 # Gauss Random
elif isinstance(initial_max, float) and isinstance(initial_min, float):
elif is_compatible_with(initial_max, float) and \
is_compatible_with(initial_min, float):
initial_max = initial_max
initial_min = initial_min
assert initial_min < initial_max
initial_mean = (initial_max + initial_min) / 2
initial_std = initial_mean - initial_min
Expand All @@ -83,16 +123,16 @@ def __init__(self, name=None, is_static=False, initial_std=None,
else:
raise RuntimeError("Unexpected branch.")

if not is_static and isinstance(l1_rate, float):
if not is_static and is_compatible_with(l1_rate, float):
self.attr['decay_rate_l1'] = l1_rate

if not is_static and isinstance(l2_rate, float):
if not is_static and is_compatible_with(l2_rate, float):
self.attr['decay_rate'] = l2_rate

if not is_static and isinstance(learning_rate, float):
if not is_static and is_compatible_with(learning_rate, float):
self.attr['learning_rate'] = learning_rate

if not is_static and isinstance(momentum, float):
if not is_static and is_compatible_with(momentum, float):
self.attr['momentum'] = momentum

if name is not None:
Expand Down
14 changes: 12 additions & 2 deletions python/paddle/trainer_config_helpers/tests/layers_test_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,20 @@
outputs(classification_cost(out, data_layer(name="label", size=num_classes)))

dotmul = mixed_layer(input=[dotmul_operator(x=x1, y=y1),
dotmul_projection(input=y1)])
dotmul_projection(input=y1)])

proj_with_attr_init = mixed_layer(input=full_matrix_projection(input=y1,
param_attr=ParamAttr(learning_rate = 0,
initial_mean = 0,
initial_std = 0)),
bias_attr = ParamAttr(initial_mean=0, initial_std=0, learning_rate=0),
act = LinearActivation(),
size = 5,
name='proj_with_attr_init')


# for ctc
tmp = fc_layer(input=[x1, dotmul],
tmp = fc_layer(input=[x1, dotmul, proj_with_attr_init],
size=num_classes + 1,
act=SoftmaxActivation())
ctc = ctc_layer(input=tmp,
Expand Down

0 comments on commit 332194c

Please sign in to comment.