Skip to content

Commit 51e7c26

Browse files
authored
Merge pull request #5641 from NHZlX/fix_prelu
Fix prelu python api
2 parents a5e73f9 + b7ebaf7 commit 51e7c26

File tree

4 files changed

+120
-18
lines changed

4 files changed

+120
-18
lines changed

python/paddle/trainer/config_parser.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2037,13 +2037,20 @@ class ParameterReluLayer(LayerBase):
20372037
def __init__(self, name, inputs, partial_sum=1, **args):
20382038
super(ParameterReluLayer, self).__init__(
20392039
name, self.layer_type, 0, inputs=inputs, **args)
2040+
20402041
input_layer = self.get_input_layer(0)
20412042
config_assert(len(self.inputs) == 1, "prelu layer has only one input.")
20422043
config_assert(input_layer.size % partial_sum == 0,
20432044
"a wrong setting for partial_sum")
2045+
2046+
dims = [1, input_layer.size / partial_sum]
20442047
self.set_layer_size(input_layer.size)
20452048
self.config.partial_sum = partial_sum
2046-
self.create_input_parameter(0, input_layer.size / partial_sum)
2049+
self.create_input_parameter(0, input_layer.size / partial_sum, dims)
2050+
2051+
self.set_layer_height_width(self.get_input_layer(0).height, \
2052+
self.get_input_layer(0).width)
2053+
self.set_layer_depth(self.get_input_layer(0).depth)
20472054

20482055

20492056
@config_layer('conv')

python/paddle/trainer_config_helpers/layers.py

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6604,10 +6604,11 @@ def row_conv_layer(input,
66046604

66056605
@layer_support()
66066606
@wrap_name_default()
6607-
@wrap_param_attr_default()
66086607
def prelu_layer(input,
66096608
name=None,
66106609
partial_sum=1,
6610+
channel_shared=None,
6611+
num_channels=None,
66116612
param_attr=None,
66126613
layer_attr=None):
66136614
"""
@@ -6638,6 +6639,12 @@ def prelu_layer(input,
66386639
- partial_sum = number of outputs, indicates all elements share the same weight.
66396640
66406641
:type partial_sum: int
6642+
:param channel_shared: whether or not the parameter are shared across channels.
6643+
- channel_shared = True, we set the partial_sum to the number of outputs.
6644+
- channel_shared = False, we set the partial_sum to the number of elements in one channel.
6645+
:type channel_shared: bool
6646+
:param num_channels: number of input channel.
6647+
:type num_channels: int
66416648
:param param_attr: The parameter attribute. See ParameterAttribute for details.
66426649
:type param_attr: ParameterAttribute
66436650
:param layer_attr: The extra layer attribute. See ExtraLayerAttribute for
@@ -6648,7 +6655,25 @@ def prelu_layer(input,
66486655
"""
66496656

66506657
assert isinstance(input, LayerOutput), 'prelu_layer accepts only one input.'
6651-
assert isinstance(param_attr, ParameterAttribute)
6658+
6659+
if not param_attr:
6660+
param_attr = ParamAttr(initial_mean=0.25, initial_std=0.0)
6661+
else:
6662+
assert isinstance(param_attr, ParameterAttribute)
6663+
6664+
if num_channels is None:
6665+
assert input.num_filters is not None, \
6666+
'the input channel cannot be detected, please specify the num_channels parameter'
6667+
num_channels = input.num_filters
6668+
6669+
if channel_shared is not None:
6670+
assert isinstance(channel_shared, bool)
6671+
assert (input.height != 0 and input.width != 0), \
6672+
'input height and widht must be setted'
6673+
if channel_shared:
6674+
partial_sum = input.height * input.width * num_channels
6675+
else:
6676+
partial_sum = input.height * input.width
66526677

66536678
l = Layer(
66546679
name=name,
@@ -6660,6 +6685,7 @@ def prelu_layer(input,
66606685
name=name,
66616686
layer_type=LayerType.PRELU,
66626687
parents=input,
6688+
num_filters=num_channels,
66636689
size=l.config.size)
66646690

66656691

python/paddle/trainer_config_helpers/tests/configs/protostr/test_prelu_layer.protostr

Lines changed: 78 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ layers {
44
type: "data"
55
size: 300
66
active_type: ""
7+
height: 10
8+
width: 10
79
}
810
layers {
911
name: "__prelu_layer_0__"
@@ -15,6 +17,9 @@ layers {
1517
input_parameter_name: "___prelu_layer_0__.w0"
1618
}
1719
partial_sum: 1
20+
height: 10
21+
width: 10
22+
depth: 1
1823
}
1924
layers {
2025
name: "__prelu_layer_1__"
@@ -26,6 +31,9 @@ layers {
2631
input_parameter_name: "___prelu_layer_1__.w0"
2732
}
2833
partial_sum: 1
34+
height: 10
35+
width: 10
36+
depth: 1
2937
}
3038
layers {
3139
name: "__prelu_layer_2__"
@@ -37,41 +45,100 @@ layers {
3745
input_parameter_name: "___prelu_layer_2__.w0"
3846
}
3947
partial_sum: 5
48+
height: 10
49+
width: 10
50+
depth: 1
51+
}
52+
layers {
53+
name: "__prelu_layer_3__"
54+
type: "prelu"
55+
size: 300
56+
active_type: ""
57+
inputs {
58+
input_layer_name: "input"
59+
input_parameter_name: "___prelu_layer_3__.w0"
60+
}
61+
partial_sum: 300
62+
height: 10
63+
width: 10
64+
depth: 1
65+
}
66+
layers {
67+
name: "__prelu_layer_4__"
68+
type: "prelu"
69+
size: 300
70+
active_type: ""
71+
inputs {
72+
input_layer_name: "input"
73+
input_parameter_name: "___prelu_layer_4__.w0"
74+
}
75+
partial_sum: 100
76+
height: 10
77+
width: 10
78+
depth: 1
4079
}
4180
parameters {
4281
name: "___prelu_layer_0__.w0"
4382
size: 300
44-
initial_mean: 0.0
45-
initial_std: 0.057735026919
83+
initial_mean: 0.25
84+
initial_std: 0.0
85+
dims: 1
86+
dims: 300
4687
initial_strategy: 0
47-
initial_smart: true
88+
initial_smart: false
4889
}
4990
parameters {
5091
name: "___prelu_layer_1__.w0"
5192
size: 300
52-
initial_mean: 0.0
53-
initial_std: 0.057735026919
93+
initial_mean: 0.25
94+
initial_std: 0.0
95+
dims: 1
96+
dims: 300
5497
initial_strategy: 0
55-
initial_smart: true
98+
initial_smart: false
5699
}
57100
parameters {
58101
name: "___prelu_layer_2__.w0"
59102
size: 60
60-
initial_mean: 0.0
61-
initial_std: 0.129099444874
103+
initial_mean: 0.25
104+
initial_std: 0.0
105+
dims: 1
106+
dims: 60
107+
initial_strategy: 0
108+
initial_smart: false
109+
}
110+
parameters {
111+
name: "___prelu_layer_3__.w0"
112+
size: 1
113+
initial_mean: 0.25
114+
initial_std: 0.0
115+
dims: 1
116+
dims: 1
117+
initial_strategy: 0
118+
initial_smart: false
119+
}
120+
parameters {
121+
name: "___prelu_layer_4__.w0"
122+
size: 3
123+
initial_mean: 0.25
124+
initial_std: 0.0
125+
dims: 1
126+
dims: 3
62127
initial_strategy: 0
63-
initial_smart: true
128+
initial_smart: false
64129
}
65130
input_layer_names: "input"
66-
output_layer_names: "__prelu_layer_2__"
131+
output_layer_names: "__prelu_layer_4__"
67132
sub_models {
68133
name: "root"
69134
layer_names: "input"
70135
layer_names: "__prelu_layer_0__"
71136
layer_names: "__prelu_layer_1__"
72137
layer_names: "__prelu_layer_2__"
138+
layer_names: "__prelu_layer_3__"
139+
layer_names: "__prelu_layer_4__"
73140
input_layer_names: "input"
74-
output_layer_names: "__prelu_layer_2__"
141+
output_layer_names: "__prelu_layer_4__"
75142
is_recurrent_layer_group: false
76143
}
77144

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
from paddle.trainer_config_helpers import *
22

3-
data = data_layer(name='input', size=300)
4-
prelu = prelu_layer(input=data)
5-
prelu = prelu_layer(input=data, partial_sum=1)
6-
prelu = prelu_layer(input=data, partial_sum=5)
3+
data = data_layer(name='input', size=300, height=10, width=10)
4+
prelu = prelu_layer(input=data, num_channels=3)
5+
prelu = prelu_layer(input=data, partial_sum=1, num_channels=3)
6+
prelu = prelu_layer(input=data, partial_sum=5, num_channels=3)
7+
prelu = prelu_layer(input=data, channel_shared=True, num_channels=3)
8+
prelu = prelu_layer(input=data, channel_shared=False, num_channels=3)
79

810
outputs(prelu)

0 commit comments

Comments
 (0)