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

2个序列作为模输入报错 #11735

Closed nuoline closed 6 years ago

nuoline commented 6 years ago
int BaseModel::predict(const IntVec& query_ids, const IntVec& seg_ids, int* ner_res) {
    if (query_ids.size() < 1 || seg_ids.size() < 1 || NULL == _machine) {
        return -1;
    }

    if (query_ids.size() != seg_ids.size()) {
        return -1;
    }
    int query_ids_num = query_ids.size();
    int seg_ids_num = seg_ids.size();
    int* i_query_ids = (int*) query_ids.data();
    int* i_seg_ids = (int*) seg_ids.data();

    paddle_arguments in_args = paddle_arguments_create_none();
    paddle_error ret1 = paddle_arguments_resize(in_args, 2);
     //word vector
    paddle_ivector query_ivector = paddle_ivector_create(
            i_query_ids, sizeof(i_query_ids) / sizeof(int), false, false);
    paddle_error ret2 =  paddle_arguments_set_ids(in_args, 0, query_ivector);
    int qivec_pos_array[] = {0, (int) query_ids_num};
    paddle_ivector seq_pos = paddle_ivector_create(
            qivec_pos_array, sizeof(qivec_pos_array) / sizeof(int), false, false);
    paddle_error ret3 = paddle_arguments_set_sequence_start_pos(in_args, 0, 0, seq_pos);

    //seg vector
    paddle_ivector seg_ivector = paddle_ivector_create(
            i_seg_ids, sizeof(i_seg_ids) / sizeof(int), false, false);
    paddle_error ret4 =  paddle_arguments_set_ids(in_args, 1, seg_ivector);
    //set the seg sequence pos
    paddle_error ret5 = paddle_arguments_set_sequence_start_pos(in_args, 1, 0, seq_pos);

    //create local threads machine for multi_thread
    paddle_gradient_machine local_machine = NULL;
    paddle_error local_mret = paddle_gradient_machine_create_shared_param(
            _machine, _config_buf, _config_size, &local_machine);
    //predict
    paddle_arguments out_args = paddle_arguments_create_none();
    paddle_error ret6 = paddle_gradient_machine_forward(local_machine,
            in_args,
            out_args,
            /* isTrain */ false);
    paddle_ivector label_res = paddle_ivector_create_none();
    paddle_error ret7 = paddle_arguments_get_ids(out_args, 0, label_res);//for new paddle
    //get predict result
    uint64_t res_size = 0;
    paddle_error ret8 = paddle_ivector_get_size(label_res, &res_size);
    paddle_error ret9 = paddle_ivector_get(label_res, &ner_res);
    if (ret8 != kPD_NO_ERROR || ret9 != kPD_NO_ERROR) {
        return -1;
    }
   paddle_error ret10 = paddle_ivector_destroy(label_res);
    paddle_error ret11 = paddle_arguments_destroy(out_args);
    paddle_error ret12 = paddle_ivector_destroy(seq_pos);
    paddle_error ret13 = paddle_ivector_destroy(query_ivector);
    paddle_error ret14 = paddle_ivector_destroy(seg_ivector);
    paddle_error ret15 = paddle_arguments_destroy(in_args);
    paddle_error ret16 = paddle_gradient_machine_destroy(local_machine);

报错: F0626 18:47:12.253069 7621 RecurrentLayer.cpp:66] Check failed: starts[numSequences] == batchSize (8 vs. 2) 我输入句子的单字个数树8

qingqing01 commented 6 years ago

以下两句有错:

   //seg vector
    paddle_ivector query_ivector = paddle_ivector_create(
            i_query_ids, sizeof(i_query_ids) / sizeof(int), false, false);

    //seg vector
    paddle_ivector seg_ivector = paddle_ivector_create(
            i_seg_ids, sizeof(i_seg_ids) / sizeof(int), false, false);

错误在于这里:

sizeof(i_query_ids) = 8 这里是一个地址计算sizeof,结果是8 sizeof(int) = 4 sizeof(i_query_ids) / sizeof(int)= 2,这是错误的。

i_query_ids正确的个数是query_ids_num。 i_seg_ids同理。

nuoline commented 6 years ago

谢谢,终于好了!