Skip to content

Commit 89d09b8

Browse files
authored
Cherry pick 1.4/ptb fix (#16607)
* test=develop, ptb_rnn fix op * test=release/1.4, refine code * test=release/1.4, fix ci failed error
1 parent 065ffcc commit 89d09b8

File tree

3 files changed

+69
-46
lines changed

3 files changed

+69
-46
lines changed

python/paddle/fluid/dygraph/layer_object_helper.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,10 @@ def iter_inputs_and_params(self, inputs_in, param_attr_in=None):
9191
9292
Returns input, param_attr
9393
"""
94+
param_attr_in = ParamAttr._to_attr(param_attr_in)
95+
if isinstance(param_attr_in, bool):
96+
raise ValueError('Param_attr should not be False in {}'.format(
97+
self.name))
9498
inputs = inputs_in if (inputs_in is not None) else []
9599
inputs = self._multiple_input(inputs)
96100
param_attrs = self._multiple_param_attr(len(inputs), param_attr_in)

python/paddle/fluid/dygraph/nn.py

Lines changed: 60 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
from .. import core
2121
from ..layers import utils
2222
from . import layers
23-
from ..framework import Variable, OpProtoHolder
23+
from ..framework import Variable, OpProtoHolder, Parameter
2424
from ..layers import layer_function_generator
2525
from ..param_attr import ParamAttr
2626
from ..initializer import Normal, Constant, NumpyArrayInitializer
@@ -213,46 +213,69 @@ def __init__(self,
213213
self._param_attr = param_attr
214214
self._bias_attr = bias_attr
215215
self._act = act
216+
self.__w = list()
216217

217-
def _build_once(self, input):
218-
input_shape = input.shape
219-
param_shape = [
220-
reduce(lambda a, b: a * b, input_shape[self._num_flatten_dims:], 1)
221-
] + [self._size]
222-
self._w = self.create_parameter(
223-
attr=self._param_attr,
224-
shape=param_shape,
225-
dtype=self._dtype,
226-
is_bias=False)
218+
@property
219+
def _w(self, i=0):
220+
return self.__w[i]
227221

228-
if self._bias_attr:
229-
size = list([self._size])
230-
self._b = self.create_parameter(
231-
attr=self._bias_attr,
232-
shape=size,
233-
dtype=self._dtype,
234-
is_bias=True)
235-
else:
236-
self._b = None
222+
@_w.setter
223+
def _w(self, value, i=0):
224+
assert isinstance(value, Parameter)
225+
self.__w[i] = value
237226

238-
def forward(self, input):
239-
tmp = self._helper.create_variable_for_type_inference(self._dtype)
240-
self._helper.append_op(
241-
type="mul",
242-
inputs={"X": input,
243-
"Y": self._w},
244-
outputs={"Out": tmp},
245-
attrs={
246-
"x_num_col_dims": self._num_flatten_dims,
247-
"y_num_col_dims": 1
248-
})
227+
def _build_once(self, input):
228+
i = 0
229+
for inp, param in self._helper.iter_inputs_and_params(input,
230+
self._param_attr):
231+
input_shape = inp.shape
232+
233+
param_shape = [
234+
reduce(lambda a, b: a * b, input_shape[self._num_flatten_dims:],
235+
1)
236+
] + [self._size]
237+
self.__w.append(
238+
self.add_parameter(
239+
'_w%d' % i,
240+
self.create_parameter(
241+
attr=param,
242+
shape=param_shape,
243+
dtype=self._dtype,
244+
is_bias=False)))
245+
i += 1
246+
247+
size = list([self._size])
248+
self._b = self.create_parameter(
249+
attr=self._bias_attr, shape=size, dtype=self._dtype, is_bias=True)
249250

250-
pre_bias = self._helper.create_variable_for_type_inference(self._dtype)
251-
self._helper.append_op(
252-
type="sum",
253-
inputs={"X": [tmp]},
254-
outputs={"Out": pre_bias},
255-
attrs={"use_mkldnn": False})
251+
def forward(self, input):
252+
mul_results = list()
253+
i = 0
254+
for inp, param in self._helper.iter_inputs_and_params(input,
255+
self._param_attr):
256+
tmp = self._helper.create_variable_for_type_inference(self._dtype)
257+
self._helper.append_op(
258+
type="mul",
259+
inputs={"X": inp,
260+
"Y": self.__w[i]},
261+
outputs={"Out": tmp},
262+
attrs={
263+
"x_num_col_dims": self._num_flatten_dims,
264+
"y_num_col_dims": 1
265+
})
266+
i += 1
267+
mul_results.append(tmp)
268+
269+
if len(mul_results) == 1:
270+
pre_bias = mul_results[0]
271+
else:
272+
pre_bias = self._helper.create_variable_for_type_inference(
273+
self._dtype)
274+
self._helper.append_op(
275+
type="sum",
276+
inputs={"X": mul_results},
277+
outputs={"Out": pre_bias},
278+
attrs={"use_mkldnn": False})
256279

257280
if self._b:
258281
pre_activation = self._helper.create_variable_for_type_inference(

python/paddle/fluid/tests/unittests/test_imperative_ptb_rnn.py

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -200,8 +200,6 @@ def forward(self, input, label, init_hidden, init_cell):
200200
rnn_out, shape=[-1, self.num_steps, self.hidden_size])
201201
projection = fluid.layers.matmul(rnn_out, self.softmax_weight)
202202
projection = fluid.layers.elementwise_add(projection, self.softmax_bias)
203-
projection = fluid.layers.reshape(
204-
projection, shape=[-1, self.vocab_size])
205203
projection = fluid.layers.reshape(
206204
projection, shape=[-1, self.vocab_size])
207205
loss = fluid.layers.softmax_with_cross_entropy(
@@ -223,6 +221,7 @@ def test_ptb_rnn_cpu_float32(self):
223221
num_steps = 3
224222
init_scale = 0.1
225223
batch_size = 4
224+
batch_num = 200
226225

227226
with fluid.dygraph.guard():
228227
fluid.default_startup_program().random_seed = seed
@@ -242,7 +241,6 @@ def test_ptb_rnn_cpu_float32(self):
242241
dy_loss = None
243242
last_hidden = None
244243
last_cell = None
245-
batch_num = 200
246244

247245
for i in range(batch_num):
248246
x_data = np.arange(12).reshape(4, 3).astype('int64')
@@ -282,7 +280,8 @@ def test_ptb_rnn_cpu_float32(self):
282280

283281
exe = fluid.Executor(fluid.CPUPlace())
284282
sgd = SGDOptimizer(learning_rate=1e-3)
285-
x = fluid.layers.data(name="x", shape=[-1, 3, 1], dtype='int64')
283+
x = fluid.layers.data(
284+
name="x", shape=[-1, num_steps, 1], dtype='int64')
286285
y = fluid.layers.data(name="y", shape=[-1, 1], dtype='float32')
287286
init_hidden = fluid.layers.data(
288287
name="init_hidden", shape=[1], dtype='float32')
@@ -332,21 +331,18 @@ def test_ptb_rnn_cpu_float32(self):
332331
for k in range(3, len(out)):
333332
static_param_updated[static_param_name_list[k -
334333
3]] = out[k]
335-
336334
self.assertTrue(np.allclose(static_loss_value, dy_loss._numpy()))
337335
self.assertTrue(np.allclose(static_last_cell_value, last_cell._numpy()))
338336
self.assertTrue(
339337
np.allclose(static_last_hidden_value, last_hidden._numpy()))
340338
for key, value in six.iteritems(static_param_init):
341339
# print("static_init name: {}, value {}".format(key, value))
342340
# print("dy_init name: {}, value {}".format(key, dy_param_init[key]))
343-
self.assertTrue(np.allclose(value, dy_param_init[key], atol=1e-5))
341+
self.assertTrue(np.allclose(value, dy_param_init[key]))
344342
for key, value in six.iteritems(static_param_updated):
345343
# print("static name: {}, value {}".format(key, value))
346344
# print("dy name: {}, value {}".format(key, dy_param_updated[key]))
347-
self.assertTrue(
348-
np.allclose(
349-
value, dy_param_updated[key], atol=1e-5))
345+
self.assertTrue(np.allclose(value, dy_param_updated[key]))
350346

351347

352348
if __name__ == '__main__':

0 commit comments

Comments
 (0)