未验证 提交 89d09b83 编写于 作者: J Jiabin Yang 提交者: GitHub

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
上级 065ffcce
...@@ -91,6 +91,10 @@ class LayerObjectHelper(LayerHelperBase): ...@@ -91,6 +91,10 @@ class LayerObjectHelper(LayerHelperBase):
Returns input, param_attr Returns input, param_attr
""" """
param_attr_in = ParamAttr._to_attr(param_attr_in)
if isinstance(param_attr_in, bool):
raise ValueError('Param_attr should not be False in {}'.format(
self.name))
inputs = inputs_in if (inputs_in is not None) else [] inputs = inputs_in if (inputs_in is not None) else []
inputs = self._multiple_input(inputs) inputs = self._multiple_input(inputs)
param_attrs = self._multiple_param_attr(len(inputs), param_attr_in) param_attrs = self._multiple_param_attr(len(inputs), param_attr_in)
......
...@@ -20,7 +20,7 @@ import numpy as np ...@@ -20,7 +20,7 @@ import numpy as np
from .. import core from .. import core
from ..layers import utils from ..layers import utils
from . import layers from . import layers
from ..framework import Variable, OpProtoHolder from ..framework import Variable, OpProtoHolder, Parameter
from ..layers import layer_function_generator from ..layers import layer_function_generator
from ..param_attr import ParamAttr from ..param_attr import ParamAttr
from ..initializer import Normal, Constant, NumpyArrayInitializer from ..initializer import Normal, Constant, NumpyArrayInitializer
...@@ -213,46 +213,69 @@ class FC(layers.Layer): ...@@ -213,46 +213,69 @@ class FC(layers.Layer):
self._param_attr = param_attr self._param_attr = param_attr
self._bias_attr = bias_attr self._bias_attr = bias_attr
self._act = act self._act = act
self.__w = list()
def _build_once(self, input): @property
input_shape = input.shape def _w(self, i=0):
param_shape = [ return self.__w[i]
reduce(lambda a, b: a * b, input_shape[self._num_flatten_dims:], 1)
] + [self._size]
self._w = self.create_parameter(
attr=self._param_attr,
shape=param_shape,
dtype=self._dtype,
is_bias=False)
if self._bias_attr: @_w.setter
size = list([self._size]) def _w(self, value, i=0):
self._b = self.create_parameter( assert isinstance(value, Parameter)
attr=self._bias_attr, self.__w[i] = value
shape=size,
dtype=self._dtype,
is_bias=True)
else:
self._b = None
def forward(self, input): def _build_once(self, input):
tmp = self._helper.create_variable_for_type_inference(self._dtype) i = 0
self._helper.append_op( for inp, param in self._helper.iter_inputs_and_params(input,
type="mul", self._param_attr):
inputs={"X": input, input_shape = inp.shape
"Y": self._w},
outputs={"Out": tmp}, param_shape = [
attrs={ reduce(lambda a, b: a * b, input_shape[self._num_flatten_dims:],
"x_num_col_dims": self._num_flatten_dims, 1)
"y_num_col_dims": 1 ] + [self._size]
}) self.__w.append(
self.add_parameter(
'_w%d' % i,
self.create_parameter(
attr=param,
shape=param_shape,
dtype=self._dtype,
is_bias=False)))
i += 1
size = list([self._size])
self._b = self.create_parameter(
attr=self._bias_attr, shape=size, dtype=self._dtype, is_bias=True)
pre_bias = self._helper.create_variable_for_type_inference(self._dtype) def forward(self, input):
self._helper.append_op( mul_results = list()
type="sum", i = 0
inputs={"X": [tmp]}, for inp, param in self._helper.iter_inputs_and_params(input,
outputs={"Out": pre_bias}, self._param_attr):
attrs={"use_mkldnn": False}) tmp = self._helper.create_variable_for_type_inference(self._dtype)
self._helper.append_op(
type="mul",
inputs={"X": inp,
"Y": self.__w[i]},
outputs={"Out": tmp},
attrs={
"x_num_col_dims": self._num_flatten_dims,
"y_num_col_dims": 1
})
i += 1
mul_results.append(tmp)
if len(mul_results) == 1:
pre_bias = mul_results[0]
else:
pre_bias = self._helper.create_variable_for_type_inference(
self._dtype)
self._helper.append_op(
type="sum",
inputs={"X": mul_results},
outputs={"Out": pre_bias},
attrs={"use_mkldnn": False})
if self._b: if self._b:
pre_activation = self._helper.create_variable_for_type_inference( pre_activation = self._helper.create_variable_for_type_inference(
......
...@@ -200,8 +200,6 @@ class PtbModel(fluid.dygraph.Layer): ...@@ -200,8 +200,6 @@ class PtbModel(fluid.dygraph.Layer):
rnn_out, shape=[-1, self.num_steps, self.hidden_size]) rnn_out, shape=[-1, self.num_steps, self.hidden_size])
projection = fluid.layers.matmul(rnn_out, self.softmax_weight) projection = fluid.layers.matmul(rnn_out, self.softmax_weight)
projection = fluid.layers.elementwise_add(projection, self.softmax_bias) projection = fluid.layers.elementwise_add(projection, self.softmax_bias)
projection = fluid.layers.reshape(
projection, shape=[-1, self.vocab_size])
projection = fluid.layers.reshape( projection = fluid.layers.reshape(
projection, shape=[-1, self.vocab_size]) projection, shape=[-1, self.vocab_size])
loss = fluid.layers.softmax_with_cross_entropy( loss = fluid.layers.softmax_with_cross_entropy(
...@@ -223,6 +221,7 @@ class TestDygraphPtbRnn(unittest.TestCase): ...@@ -223,6 +221,7 @@ class TestDygraphPtbRnn(unittest.TestCase):
num_steps = 3 num_steps = 3
init_scale = 0.1 init_scale = 0.1
batch_size = 4 batch_size = 4
batch_num = 200
with fluid.dygraph.guard(): with fluid.dygraph.guard():
fluid.default_startup_program().random_seed = seed fluid.default_startup_program().random_seed = seed
...@@ -242,7 +241,6 @@ class TestDygraphPtbRnn(unittest.TestCase): ...@@ -242,7 +241,6 @@ class TestDygraphPtbRnn(unittest.TestCase):
dy_loss = None dy_loss = None
last_hidden = None last_hidden = None
last_cell = None last_cell = None
batch_num = 200
for i in range(batch_num): for i in range(batch_num):
x_data = np.arange(12).reshape(4, 3).astype('int64') x_data = np.arange(12).reshape(4, 3).astype('int64')
...@@ -282,7 +280,8 @@ class TestDygraphPtbRnn(unittest.TestCase): ...@@ -282,7 +280,8 @@ class TestDygraphPtbRnn(unittest.TestCase):
exe = fluid.Executor(fluid.CPUPlace()) exe = fluid.Executor(fluid.CPUPlace())
sgd = SGDOptimizer(learning_rate=1e-3) sgd = SGDOptimizer(learning_rate=1e-3)
x = fluid.layers.data(name="x", shape=[-1, 3, 1], dtype='int64') x = fluid.layers.data(
name="x", shape=[-1, num_steps, 1], dtype='int64')
y = fluid.layers.data(name="y", shape=[-1, 1], dtype='float32') y = fluid.layers.data(name="y", shape=[-1, 1], dtype='float32')
init_hidden = fluid.layers.data( init_hidden = fluid.layers.data(
name="init_hidden", shape=[1], dtype='float32') name="init_hidden", shape=[1], dtype='float32')
...@@ -332,7 +331,6 @@ class TestDygraphPtbRnn(unittest.TestCase): ...@@ -332,7 +331,6 @@ class TestDygraphPtbRnn(unittest.TestCase):
for k in range(3, len(out)): for k in range(3, len(out)):
static_param_updated[static_param_name_list[k - static_param_updated[static_param_name_list[k -
3]] = out[k] 3]] = out[k]
self.assertTrue(np.allclose(static_loss_value, dy_loss._numpy())) self.assertTrue(np.allclose(static_loss_value, dy_loss._numpy()))
self.assertTrue(np.allclose(static_last_cell_value, last_cell._numpy())) self.assertTrue(np.allclose(static_last_cell_value, last_cell._numpy()))
self.assertTrue( self.assertTrue(
...@@ -340,13 +338,11 @@ class TestDygraphPtbRnn(unittest.TestCase): ...@@ -340,13 +338,11 @@ class TestDygraphPtbRnn(unittest.TestCase):
for key, value in six.iteritems(static_param_init): for key, value in six.iteritems(static_param_init):
# print("static_init name: {}, value {}".format(key, value)) # print("static_init name: {}, value {}".format(key, value))
# print("dy_init name: {}, value {}".format(key, dy_param_init[key])) # print("dy_init name: {}, value {}".format(key, dy_param_init[key]))
self.assertTrue(np.allclose(value, dy_param_init[key], atol=1e-5)) self.assertTrue(np.allclose(value, dy_param_init[key]))
for key, value in six.iteritems(static_param_updated): for key, value in six.iteritems(static_param_updated):
# print("static name: {}, value {}".format(key, value)) # print("static name: {}, value {}".format(key, value))
# print("dy name: {}, value {}".format(key, dy_param_updated[key])) # print("dy name: {}, value {}".format(key, dy_param_updated[key]))
self.assertTrue( self.assertTrue(np.allclose(value, dy_param_updated[key]))
np.allclose(
value, dy_param_updated[key], atol=1e-5))
if __name__ == '__main__': if __name__ == '__main__':
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册