PaddlePaddle / Paddle

PArallel Distributed Deep LEarning: Machine Learning Framework from Industrial Practice (『飞桨』核心框架,深度学习&机器学习高性能单机、分布式训练和跨平台部署)
http://www.paddlepaddle.org/
Apache License 2.0
22.2k stars 5.57k forks source link

Error about preparing the generator of LSTM. #7642

Closed huboqiang closed 6 years ago

huboqiang commented 6 years ago

Hi I met an error when running the code of paddlepaddle. I succeed in running the code https://github.com/PaddlePaddle/book/tree/develop/07.label_semantic_roles, and I am now trying to use my data instead. However, I got the NotImplementedError "NotImplementedError: Wrong number or type of arguments for overloaded function 'IVector_create'. " here, and I just want to ask for help.


My generator would return the matrix just looked like below:

dense_len = 512
rnn_size = 512
num_surround = 50
dim_features = 2048
window_size = 2*num_surround + 1
classnum = 2

reader = paddle.batch(
        mygenerator,
        batch_size=5)

xxx = next(reader())
print(np.array(xxx[0]).shape)

# 0-2047 for np.float32 feature vector and 2048 for 0/1 label vector with length of 101
print(xxx[0][0],xxx[0][2048])
(2049, 101)
(array([  2.98041910e-01,   1.73049852e-01,   2.47034952e-01,
         1.80816606e-01,   3.75531942e-01,   2.78075159e-01,
         4.30526137e-01,   7.42600337e-02,   9.86034647e-02,
         9.21842694e-01,   4.11963835e-02,   1.35974967e+00,
         8.70254815e-01,   4.27515626e-01,   3.20965916e-01,
         6.50848448e-02,   1.20498456e-01,   3.67648862e-02,
         1.53382197e-02,   1.33140292e-02,   3.92237790e-02,
         9.86534730e-02,   2.03908533e-02,   1.88109770e-01,
         1.62906572e-01,   4.48994935e-01,   3.13364565e-01,
         4.04399559e-02,   2.21656859e-02,   7.52309561e-02,
         1.00172389e+00,   1.05875540e+00,   6.03765905e-01,
         4.10904020e-01,   4.31393594e-01,   1.05298288e-01,
         2.74235219e-01,   2.97070354e-01,   2.85349949e-03,
         1.49445415e-01,   6.95996523e-01,   5.15649676e-01,
         5.41690230e-01,   4.16157007e-01,   1.61992475e-01,
         1.60157025e-01,   1.97162125e-02,   1.17172804e-02,
         1.24548178e-03,   2.20104656e-03,   8.77450928e-02,
         5.44372126e-02,   1.56765774e-01,   1.64405435e-01,
         1.61495969e-01,   5.07324710e-02,   9.88956243e-02,
         5.33226505e-02,   2.08920967e-02,   3.15743648e-02,
         2.34124009e-02,   8.31749961e-02,   2.44949404e-02,
         0.00000000e+00,   3.48108768e-01,   1.05107538e-01,
         1.03809396e-02,   2.56456316e-01,   3.74844074e-01,
         1.22395813e-01,   1.17950048e-02,   8.51775482e-02,
         5.20959869e-02,   3.96219306e-02,   1.70764908e-01,
         1.95689708e-01,   3.11477557e-02,   9.99350008e-03,
         1.09678365e-01,   6.55672178e-02,   7.66178668e-02,
         9.13264900e-02,   0.00000000e+00,   1.46432295e-01,
         1.28796354e-01,   2.20062584e-01,   0.00000000e+00,
         8.63664597e-03,   9.83473510e-02,   1.12625025e-01,
         3.17641459e-02,   5.96613549e-02,   1.84954137e-01,
         9.77690816e-02,   3.08971461e-02,   8.76073912e-02,
         2.03497455e-01,   9.15574059e-02,   1.43502861e-01,
         3.93723212e-02,   2.30763391e-01], dtype=float32), [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])

model:

paddle.init(use_gpu=False, trainer_count=1)

default_std = 1 / math.sqrt(rnn_size) / 3.0
std_default = paddle.attr.Param(initial_std=default_std)
std_0       = paddle.attr.Param(initial_std=0.)
mix_hidden_lr     = 1e-3
lstm_para_attr    = paddle.attr.Param(
    initial_std   = 0.0, 
    learning_rate = 1.0
)
hidden_para_attr = paddle.attr.Param(
    initial_std   = default_std, 
    learning_rate = mix_hidden_lr
)

l_x0 = [paddle.layer.data(name='rnn_layer_%d' % (i), type=paddle.data_type.dense_vector(window_size)) 
            for i in range(dim_features)
]
target = paddle.layer.data(name='label', type=paddle.data_type.integer_value_sequence(classnum))
l_x1 = [
    paddle.layer.embedding(
        size=dense_len, input=x0
    ) for x0 in l_x0
]

hidden_0 = paddle.layer.mixed(
    size=rnn_size,
    bias_attr=std_default,
    input=[
        paddle.layer.full_matrix_projection(
            input=x1, param_attr=std_default
        ) for x1 in l_x1
    ]
)

lstm_0 = paddle.layer.lstmemory(
    input=hidden_0,
    act=paddle.activation.Relu(),
    gate_act=paddle.activation.Sigmoid(),
    state_act=paddle.activation.Sigmoid(),
    bias_attr=std_0,
    param_attr=lstm_para_attr
)

feature_out = paddle.layer.mixed(
    size=classnum,
    bias_attr=std_default,
    input=[
        paddle.layer.full_matrix_projection(
            input=hidden_0, param_attr=hidden_para_attr),
        paddle.layer.full_matrix_projection(
            input=lstm_0, param_attr=lstm_para_attr)
    ]
)

crf_cost = paddle.layer.crf(
    size=classnum,
    input=feature_out,
    label=target,
    param_attr=paddle.attr.Param(
        name='crfw',
        initial_std=default_std,
        learning_rate=mix_hidden_lr
    )
)

crf_dec = paddle.layer.crf_decoding(
   size=classnum,
   input=feature_out,
   label=target,
   param_attr=paddle.attr.Param(name='crfw'))

evaluator.sum(input=crf_dec)

trainer and training process:

parameters = paddle.parameters.create(crf_cost)
optimizer = paddle.optimizer.Momentum(
    momentum=0,
    learning_rate=1e-3,
    regularization=paddle.optimizer.L2Regularization(rate=8e-4),
    model_average=paddle.optimizer.ModelAverage(
        average_window=0.5, max_average_window=10000), )

trainer = paddle.trainer.SGD(cost=crf_cost,
                             parameters=parameters,
                             update_equation=optimizer,
                             extra_layers=crf_dec)

l_name = ['rnn_layer_%d' % (i) for i in range(dim_features)] + ['label']
l_idx = range(dim_features + 1)
feeding = dict(zip(l_name, l_idx))

trainer.train(
    reader=reader,
    num_passes=1,
    feeding=feeding
)

And the error information is here:

NotImplementedErrorTraceback (most recent call last)
<ipython-input-17-3ea63e92e8fb> in <module>()
      6     reader=reader,
      7     num_passes=1,
----> 8     feeding=feeding
      9 )

/usr/local/lib/python2.7/dist-packages/paddle/v2/trainer.pyc in train(self, reader, num_passes, event_handler, feeding)
    167                 pass_type = self.__parameter_updater__.startBatch(
    168                     len(data_batch))
--> 169                 in_args = feeder(data_batch)
    170                 self.__prepare_parameter__(in_args)
    171                 self.__gradient_machine__.forwardBackward(in_args, out_args,

/usr/local/lib/python2.7/dist-packages/py_paddle/dataprovider_converter.pyc in __call__(self, dat, argument)
    280 
    281     def __call__(self, dat, argument=None):
--> 282         return self.convert(dat, argument)
    283 
    284     @staticmethod

/usr/local/lib/python2.7/dist-packages/paddle/v2/data_feeder.pyc in convert(self, dat, argument)
    131             return retv
    132 
--> 133         return DataProviderConverter.convert(self, reorder_data(dat), argument)

/usr/local/lib/python2.7/dist-packages/py_paddle/dataprovider_converter.pyc in convert(self, dat, argument)
    275 
    276         for scanner in scanners:
--> 277             scanner.finish_scan(argument)
    278 
    279         return argument

/usr/local/lib/python2.7/dist-packages/py_paddle/dataprovider_converter.pyc in finish_scan(self, argument)
    236         seq = swig_paddle.IVector.create(self.__seq__, False)
    237         self.__setter__(argument, self.pos, seq)
--> 238         self.__inner_scanner__.finish_scan(argument)
    239 
    240     def get_size(self, dat):

/usr/local/lib/python2.7/dist-packages/py_paddle/dataprovider_converter.pyc in finish_scan(self, argument)
    209 
    210     def finish_scan(self, argument):
--> 211         ids = swig_paddle.IVector.create(self.__ids__, self.data_in_gpu)
    212         assert isinstance(argument, swig_paddle.Arguments)
    213         argument.setSlotIds(self.pos, ids)

/usr/local/lib/python2.7/dist-packages/py_paddle/swig_paddle.pyc in create(*args)
    879         create(vector_int data) -> IVector
    880         """
--> 881         return _swig_paddle.IVector_create(*args)
    882 
    883     if _newclass:create = staticmethod(create)

NotImplementedError: Wrong number or type of arguments for overloaded function 'IVector_create'.
  Possible C/C++ prototypes are:
    IVector::create(std::vector< int,std::allocator< int > > const &,bool)
    IVector::create(std::vector< int,std::allocator< int > > const &)

So what's wrong with my code? How could I fix that? Thank you!

JiayiFeng commented 6 years ago

Why is the input data a 2D matrix? What does it's row and column mean?

huboqiang commented 6 years ago

Yes, the input data is an 2D matrix, while there are 2048 features (dim_features), and 101 time points (window_size). Each time point has 2048 features and I just want to use LSTM to train this model.

JiayiFeng commented 6 years ago

It seems that what you need is not a semantic roles model. Can you describe your demand in detail? Including the mean of data and label, and your train target.

huboqiang commented 6 years ago

This is the dataset http://ai.baidu.com/broad/introduction. See Video Highlights challenge. I've built a model in keras, but I think paddlepaddle would do better because of it's high performance for RNN and CRF module. So I just tried to rewrite my model in paddlepaddle. Semantic roles model is the most relevant learning material I could find, but I just failed.

JiayiFeng commented 6 years ago
l_x0 = [paddle.layer.data(name='rnn_layer_%d' % (i), type=paddle.data_type.dense_vector(window_size)) 
            for i in range(dim_features)
]
target = paddle.layer.data(name='label', type=paddle.data_type.integer_value_sequence(classnum))
l_x1 = [
    paddle.layer.embedding(
        size=dense_len, input=x0
    ) for x0 in l_x0
]

The input of an embeding layer can only be an integer vector.

huboqiang commented 6 years ago

Thank you! But the input X-matrix were not int. So I tried to change embedding to fc:

l_x1 = [
    paddle.layer.fc(
        size=dense_len, input=x0
    ) for x0 in l_x0
]

And the same error info is still here:

NotImplementedError: Wrong number or type of arguments for overloaded function 'IVector_create'.
  Possible C/C++ prototypes are:
    IVector::create(std::vector< int,std::allocator< int > > const &,bool)
    IVector::create(std::vector< int,std::allocator< int > > const &)