op_param.h 21.4 KB
Newer Older
W
wangliu 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13
/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. */
朔-望's avatar
朔-望 已提交
14

15
#pragma once
朔-望's avatar
朔-望 已提交
16

E
eclipsess 已提交
17
#include <string>
W
wangliu 已提交
18
#include <vector>
L
liuruilong 已提交
19
#include "common/log.h"
朔-望's avatar
朔-望 已提交
20 21 22 23 24 25 26
#include "common/type_define.h"
#include "framework/lod_tensor.h"
#include "framework/scope.h"
#include "framework/tensor.h"
#include "framework/variable.h"

namespace paddle_mobile {
朔-望's avatar
朔-望 已提交
27 28
namespace operators {

W
wangliu 已提交
29 30 31 32 33 34 35
using framework::Attribute;
using framework::AttributeMap;
using framework::LoDTensor;
using framework::Scope;
using framework::Tensor;
using std::string;
using std::vector;
朔-望's avatar
朔-望 已提交
36 37

class OpParam : PaddleMobileObject {
朔-望's avatar
朔-望 已提交
38
 protected:
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
  template <typename T>
  static T *InputFrom(const VariableNameMap &inputs, const Scope &scope) {
    return GetVarValue<T>("Input", inputs, scope);
  }

  template <typename T>
  static T *InputXFrom(const VariableNameMap &inputs, const Scope &scope) {
    return GetVarValue<T>("X", inputs, scope);
  }

  template <typename T>
  static T *InputYFrom(const VariableNameMap &inputs, const Scope &scope) {
    return GetVarValue<T>("Y", inputs, scope);
  }

  template <typename T>
  static T *InputBiasFrom(const VariableNameMap &inputs, const Scope &scope) {
    return GetVarValue<T>("Bias", inputs, scope);
  }
  template <typename T>
  static T *InputVarianceFrom(const VariableNameMap &inputs,
                              const Scope &scope) {
    return GetVarValue<T>("Variance", inputs, scope);
  }
  template <typename T>
  static T *InputMeanFrom(const VariableNameMap &inputs, const Scope &scope) {
    return GetVarValue<T>("Mean", inputs, scope);
  }
  template <typename T>
  static T *InputScaleFrom(const VariableNameMap &inputs, const Scope &scope) {
    return GetVarValue<T>("Scale", inputs, scope);
  }
E
eclipsess 已提交
71 72 73 74
  template <typename T>
  static T *InputImageFrom(const VariableNameMap &inputs, const Scope &scope) {
    return GetVarValue<T>("Image", inputs, scope);
  }
E
eclipsess 已提交
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
  template <typename T>
  static T *InputPriorBoxFrom(const VariableNameMap &inputs,
                              const Scope &scope) {
    return GetVarValue<T>("PriorBox", inputs, scope);
  }
  template <typename T>
  static T *InputPriorBoxVarFrom(const VariableNameMap &inputs,
                                 const Scope &scope) {
    return GetVarValue<T>("PriorBoxVar", inputs, scope);
  }
  // LoDTensor but now use Tensor
  template <typename T>
  static T *InputTargetBoxFrom(const VariableNameMap &inputs,
                               const Scope &scope) {
    return GetVarValue<T>("TargetBox", inputs, scope);
  }
91

E
eclipsess 已提交
92 93 94 95 96 97 98 99 100 101
  template <typename T>
  static T *InputBBoxesFrom(const VariableNameMap &inputs, const Scope &scope) {
    return GetVarValue<T>("BBoxes", inputs, scope);
  }

  template <typename T>
  static T *InputScoresFrom(const VariableNameMap &inputs, const Scope &scope) {
    return GetVarValue<T>("Scores", inputs, scope);
  }

E
eclipsess 已提交
102 103 104 105
  template <typename T>
  static T *InputShapeFrom(const VariableNameMap &inputs, const Scope &scope) {
    return GetVarValue<T>("Shape", inputs, scope);
  }
E
eclipsess 已提交
106

107
  template <typename T>
W
wangliu 已提交
108 109
  static vector<T *> InputMultiFrom(const VariableNameMap &inputs,
                                    const Scope &scope) {
110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
    return GetMultiVarValue<T>("X", inputs, scope);
  }

  template <typename T>
  static T *OutputFrom(const VariableNameMap &outputs, const Scope &scope) {
    return GetVarValue<T>("Output", outputs, scope);
  }

  template <typename T>
  static T *OutFrom(const VariableNameMap &outputs, const Scope &scope) {
    return GetVarValue<T>("Out", outputs, scope);
  }

  template <typename T>
  static T *OutputYFrom(const VariableNameMap &outputs, const Scope &scope) {
    return GetVarValue<T>("Y", outputs, scope);
  }

E
eclipsess 已提交
128 129 130 131 132 133
  template <typename T>
  static T *OutputBoxesFrom(const VariableNameMap &outputs,
                            const Scope &scope) {
    return GetVarValue<T>("Boxes", outputs, scope);
  }

E
eclipsess 已提交
134 135 136 137 138
  template <typename T>
  static T *OutputBoxFrom(const VariableNameMap &outputs, const Scope &scope) {
    return GetVarValue<T>("OutputBox", outputs, scope);
  }

E
eclipsess 已提交
139 140 141 142 143 144
  template <typename T>
  static T *OutputVariancesFrom(const VariableNameMap &outputs,
                                const Scope &scope) {
    return GetVarValue<T>("Variances", outputs, scope);
  }

145 146 147 148 149 150 151 152 153 154 155
  template <typename T>
  static T *MidOutFrom(const VariableNameMap &outputs, const Scope &scope) {
    return GetVarValue<T>("MidOut", outputs, scope);
  }

  template <typename T>
  static T *FilterFrom(const VariableNameMap &inputs, const Scope &scope) {
    return GetVarValue<T>("Filter", inputs, scope);
  }

  template <typename T>
W
wangliu 已提交
156
  static const T GetAttr(const string &key, const AttributeMap &map) {
157 158 159 160
    return ((Attribute)map.at(key)).Get<T>();
  }

  template <typename T>
W
wangliu 已提交
161
  static T *GetVarValue(const string &key, const VariableNameMap &var_map,
162 163 164 165 166 167 168 169 170
                        const Scope &scope) {
    auto var_vec = var_map.at(key);
    if (!var_vec.empty()) {
      //      std::cout << " get var value -- " << var_vec[0] <<
      //      std::endl;
      auto var = scope.FindVar(var_vec[0]);
      return var->GetMutable<T>();
    } else {
      return nullptr;
朔-望's avatar
朔-望 已提交
171
    }
172
  }
朔-望's avatar
朔-望 已提交
173

174
  template <typename T>
W
wangliu 已提交
175 176 177
  static vector<T *> GetMultiVarValue(const string &key,
                                      const VariableNameMap &var_map,
                                      const Scope &scope) {
178 179
    auto var_vecs = var_map.at(key);
    assert(var_vecs.size() > 1);
W
wangliu 已提交
180
    vector<T *> var_res;
181 182 183
    for (auto &var_vec : var_vecs) {
      auto var = scope.FindVar(var_vec);
      var_res.push_back(var->GetMutable<T>());
朔-望's avatar
朔-望 已提交
184
    }
185 186
    return var_res;
  }
朔-望's avatar
朔-望 已提交
187 188 189
};

class ConvParam : OpParam {
朔-望's avatar
朔-望 已提交
190
 public:
191 192 193
  ConvParam(const VariableNameMap &inputs, const VariableNameMap &outputs,
            const framework::AttributeMap &attrs,
            const framework::Scope &scope) {
W
wangliu 已提交
194 195 196 197 198 199
    filter_ = FilterFrom<LoDTensor>(inputs, scope);
    input_ = InputFrom<Tensor>(inputs, scope);
    output_ = OutputFrom<Tensor>(outputs, scope);
    strides_ = GetAttr<vector<int>>("strides", attrs);
    paddings_ = GetAttr<vector<int>>("paddings", attrs);
    dilations_ = GetAttr<vector<int>>("dilations", attrs);
200 201
    groups = GetAttr<int>("groups", attrs);
  }
朔-望's avatar
朔-望 已提交
202

203
  const Tensor *Input() const { return input_; }
朔-望's avatar
朔-望 已提交
204

205
  const LoDTensor *Filter() const { return filter_; }
朔-望's avatar
朔-望 已提交
206

207
  Tensor *Output() const { return output_; }
朔-望's avatar
朔-望 已提交
208

W
wangliu 已提交
209
  const vector<int> &Strides() const { return strides_; }
朔-望's avatar
朔-望 已提交
210

W
wangliu 已提交
211
  const vector<int> &Paddings() const { return paddings_; }
朔-望's avatar
朔-望 已提交
212

W
wangliu 已提交
213
  const vector<int> &Dilations() const { return dilations_; }
朔-望's avatar
朔-望 已提交
214

215
  const int &Groups() const { return groups; }
朔-望's avatar
朔-望 已提交
216

朔-望's avatar
朔-望 已提交
217
 private:
218 219 220
  Tensor *input_;
  Tensor *output_;
  LoDTensor *filter_;
W
wangliu 已提交
221 222 223
  vector<int> strides_;
  vector<int> paddings_;
  vector<int> dilations_;
224
  int groups;
朔-望's avatar
朔-望 已提交
225 226 227 228 229
};

Print &operator<<(Print &printer, const ConvParam &conv_param);

class ElementwiseAddParam : OpParam {
朔-望's avatar
朔-望 已提交
230
 public:
231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248
  ElementwiseAddParam(const VariableNameMap &inputs,
                      const VariableNameMap &outputs,
                      const framework::AttributeMap &attrs,
                      const framework::Scope &scope) {
    input_x_ = InputXFrom<framework::Tensor>(inputs, scope);
    input_y_ = InputYFrom<framework::Tensor>(inputs, scope);
    out_ = OutFrom<framework::Tensor>(outputs, scope);
    axis_ = GetAttr<int>("axis", attrs);
  }

  const Tensor *InputX() const { return input_x_; }

  const Tensor *InputY() const { return input_y_; }

  Tensor *Out() const { return out_; }

  const int &Axis() const { return axis_; }

朔-望's avatar
朔-望 已提交
249
 private:
250 251 252 253
  Tensor *input_x_;
  Tensor *input_y_;
  Tensor *out_;
  int axis_;
朔-望's avatar
朔-望 已提交
254 255 256
};

class MulParam : OpParam {
朔-望's avatar
朔-望 已提交
257
 public:
258 259 260 261 262 263 264 265 266
  MulParam(const VariableNameMap &inputs, const VariableNameMap &outputs,
           const framework::AttributeMap &attrs,
           const framework::Scope &scope) {
    input_x_ = InputXFrom<framework::Tensor>(inputs, scope);
    input_y_ = InputYFrom<framework::Tensor>(inputs, scope);
    out_ = OutFrom<framework::Tensor>(outputs, scope);
    x_num_col_dims_ = GetAttr<int>("x_num_col_dims", attrs);
    y_num_col_dims_ = GetAttr<int>("y_num_col_dims", attrs);
  }
朔-望's avatar
朔-望 已提交
267

268
  const Tensor *InputX() const { return input_x_; }
朔-望's avatar
朔-望 已提交
269

270
  const Tensor *InputY() const { return input_y_; }
朔-望's avatar
朔-望 已提交
271

272
  Tensor *Out() const { return out_; }
朔-望's avatar
朔-望 已提交
273

274
  const int &XNumColDims() const { return x_num_col_dims_; }
朔-望's avatar
朔-望 已提交
275

276
  const int &YNumColDims() const { return y_num_col_dims_; }
朔-望's avatar
朔-望 已提交
277

朔-望's avatar
朔-望 已提交
278
 private:
279 280 281 282 283
  Tensor *input_x_;
  Tensor *input_y_;
  Tensor *out_;
  int x_num_col_dims_;
  int y_num_col_dims_;
朔-望's avatar
朔-望 已提交
284 285 286
};

class ConcatParam : public OpParam {
朔-望's avatar
朔-望 已提交
287
 public:
288 289 290 291 292 293 294
  ConcatParam(const VariableNameMap &inputs, const VariableNameMap &outputs,
              const framework::AttributeMap &attrs,
              const framework::Scope &scope) {
    inputs_ = InputMultiFrom<framework::Tensor>(inputs, scope);
    out_ = OutFrom<framework::Tensor>(outputs, scope);
    axis_ = GetAttr<int>("axis", attrs);
  }
朔-望's avatar
朔-望 已提交
295

W
wangliu 已提交
296
  vector<Tensor *> Inputs() const { return inputs_; }
朔-望's avatar
朔-望 已提交
297

298
  Tensor *Out() const { return out_; }
朔-望's avatar
朔-望 已提交
299

300
  const int &Axis() const { return axis_; }
朔-望's avatar
朔-望 已提交
301

朔-望's avatar
朔-望 已提交
302
 private:
W
wangliu 已提交
303
  vector<Tensor *> inputs_;
304 305
  Tensor *out_;
  int axis_;
朔-望's avatar
朔-望 已提交
306 307
};

E
eclipsess 已提交
308
class LrnParam : public OpParam {
朔-望's avatar
朔-望 已提交
309
 public:
310 311 312 313 314 315 316 317 318 319
  LrnParam(const VariableNameMap &inputs, const VariableNameMap &outputs,
           const framework::AttributeMap &attrs,
           const framework::Scope &scope) {
    input_x_ = InputXFrom<framework::Tensor>(inputs, scope);
    out_ = OutFrom<framework::Tensor>(outputs, scope);
    mid_out_ = MidOutFrom<framework::Tensor>(outputs, scope);
    n_ = GetAttr<int>("n", attrs);
    alpha_ = GetAttr<float>("alpha", attrs);
    beta_ = GetAttr<float>("beta", attrs);
    k_ = GetAttr<float>("k", attrs);
W
wangliu 已提交
320
    data_format_ = GetAttr<string>("data_format", attrs);
321
  }
E
eclipsess 已提交
322

323
  const Tensor *InputX() const { return input_x_; }
E
eclipsess 已提交
324

325
  Tensor *Out() const { return out_; }
E
eclipsess 已提交
326

327
  Tensor *MidOut() const { return mid_out_; }
E
eclipsess 已提交
328

329
  const int &N() const { return n_; }
E
eclipsess 已提交
330

331
  const float &Alpha() const { return alpha_; }
E
eclipsess 已提交
332

333
  const float &Beta() const { return beta_; }
E
eclipsess 已提交
334

335
  const float &K() const { return k_; }
E
eclipsess 已提交
336

W
wangliu 已提交
337
  const string &DataFormat() const { return data_format_; }
E
eclipsess 已提交
338

朔-望's avatar
朔-望 已提交
339
 private:
340 341 342 343 344 345 346
  Tensor *input_x_;
  Tensor *out_;
  Tensor *mid_out_;
  int n_;
  float alpha_;
  float beta_;
  float k_;
W
wangliu 已提交
347
  string data_format_;
E
eclipsess 已提交
348
};
E
eclipsess 已提交
349
class BatchNormParam : OpParam {
朔-望's avatar
朔-望 已提交
350
 public:
351 352 353 354 355 356 357 358 359 360 361 362 363
  BatchNormParam(const VariableNameMap &inputs, const VariableNameMap &outputs,
                 const framework::AttributeMap &attrs,
                 const framework::Scope &scope) {
    input_x_ = InputXFrom<framework::Tensor>(inputs, scope);
    output_y_ = OutputYFrom<framework::Tensor>(outputs, scope);
    input_bias_ = InputBiasFrom<framework::Tensor>(inputs, scope);
    input_mean_ = InputMeanFrom<framework::Tensor>(inputs, scope);
    input_scale_ = InputScaleFrom<framework::Tensor>(inputs, scope);
    input_variance_ = InputVarianceFrom<framework::Tensor>(inputs, scope);
    epsilon_ = GetAttr<float>("epsilon", attrs);
    momentum_ = GetAttr<float>("momentum", attrs);
    is_test_ = GetAttr<bool>("is_test", attrs);
  }
E
eclipsess 已提交
364

365
  const Tensor *InputX() const { return input_x_; }
E
eclipsess 已提交
366

367
  Tensor *OutputY() const { return output_y_; }
E
eclipsess 已提交
368

369
  const Tensor *InputBias() const { return input_bias_; }
E
eclipsess 已提交
370

371
  const Tensor *InputMean() const { return input_mean_; }
E
eclipsess 已提交
372

373
  const Tensor *InputScale() const { return input_scale_; }
E
eclipsess 已提交
374

375
  const Tensor *InputVariance() const { return input_variance_; }
E
eclipsess 已提交
376

377
  const float &Epsilon() const { return epsilon_; }
E
eclipsess 已提交
378

379
  const float &Momentum() const { return momentum_; }
E
eclipsess 已提交
380

381
  const bool &IsTest() const { return is_test_; }
E
eclipsess 已提交
382

W
wangliu 已提交
383
  const string &DataFormat() const { return data_format_; }
E
eclipsess 已提交
384

朔-望's avatar
朔-望 已提交
385
 private:
386 387 388 389 390 391 392 393 394
  Tensor *input_x_;
  Tensor *output_y_;
  Tensor *input_bias_;
  Tensor *input_mean_;
  Tensor *input_scale_;
  Tensor *input_variance_;
  float epsilon_;
  float momentum_;
  bool is_test_;
W
wangliu 已提交
395
  string data_format_;
E
eclipsess 已提交
396
};
397
class PoolParam : public OpParam {
朔-望's avatar
朔-望 已提交
398
 public:
399 400 401 402 403 404
  PoolParam(const VariableNameMap &inputs, const VariableNameMap &outputs,
            const framework::AttributeMap &attrs,
            const framework::Scope &scope) {
    input_ = InputXFrom<framework::Tensor>(inputs, scope);

    output_ = OutFrom<framework::Tensor>(outputs, scope);
W
wangliu 已提交
405 406 407 408
    pooling_type_ = GetAttr<string>("pooling_type", attrs);
    ksize_ = GetAttr<vector<int>>("ksize", attrs);
    strides_ = GetAttr<vector<int>>("strides", attrs);
    paddings_ = GetAttr<vector<int>>("paddings", attrs);
409 410 411
    ceil_mode_ = GetAttr<bool>("ceil_mode", attrs);
    gloabal_pooling_ = GetAttr<bool>("global_pooling", attrs);
  }
412

413
  const Tensor *Input() const { return input_; }
414

415
  Tensor *Output() const { return output_; }
416

W
wangliu 已提交
417
  const string &PoolingType() const { return pooling_type_; }
418

W
wangliu 已提交
419
  const vector<int> &Ksize() const { return ksize_; }
420

W
wangliu 已提交
421
  const vector<int> &Strides() const { return strides_; }
422

W
wangliu 已提交
423
  const vector<int> &Paddings() const { return paddings_; }
424

425
  bool isCeilMode() const { return ceil_mode_; }
426

427
  bool isGlobalPooling() const { return gloabal_pooling_; }
428

朔-望's avatar
朔-望 已提交
429
 private:
430 431
  Tensor *input_;
  Tensor *output_;
W
wangliu 已提交
432 433 434 435
  string pooling_type_;
  vector<int> ksize_;
  vector<int> strides_;
  vector<int> paddings_;
436 437
  bool ceil_mode_;
  bool gloabal_pooling_ = false;
438 439
};

E
eclipsess 已提交
440 441 442 443 444 445 446 447 448
class PriorBoxParam : public OpParam {
 public:
  PriorBoxParam(const VariableNameMap &inputs, const VariableNameMap &outputs,
                const framework::AttributeMap &attrs,
                const framework::Scope &scope) {
    input_ = InputFrom<framework::Tensor>(inputs, scope);
    input_image_ = InputImageFrom<framework::Tensor>(inputs, scope);
    output_boxes_ = OutputBoxesFrom<framework::Tensor>(outputs, scope);
    output_variances_ = OutputVariancesFrom<framework::Tensor>(outputs, scope);
W
wangliu 已提交
449 450 451 452
    min_sizes_ = GetAttr<vector<float>>("min_sizes", attrs);
    max_sizes_ = GetAttr<vector<float>>("max_sizes", attrs);
    aspect_ratios_ = GetAttr<vector<float>>("aspect_ratios", attrs);
    variances_ = GetAttr<vector<float>>("variances", attrs);
E
eclipsess 已提交
453 454 455 456 457 458 459 460 461 462 463 464 465 466
    flip_ = GetAttr<bool>("flip", attrs);
    clip_ = GetAttr<bool>("clip", attrs);
    step_w_ = GetAttr<float>("step_w", attrs);
    step_h_ = GetAttr<float>("step_h", attrs);
    offset_ = GetAttr<float>("offset", attrs);
  }
  const Tensor *Input() const { return input_; }

  const Tensor *InputImage() const { return input_image_; }

  Tensor *OutputBoxes() const { return output_boxes_; }

  Tensor *OutputVariances() const { return output_variances_; }

W
wangliu 已提交
467
  const vector<float> &MinSizes() const { return min_sizes_; }
E
eclipsess 已提交
468

W
wangliu 已提交
469
  const vector<float> &MaxSizes() const { return max_sizes_; }
E
eclipsess 已提交
470

W
wangliu 已提交
471
  const vector<float> &AspectRatios() const { return aspect_ratios_; }
E
eclipsess 已提交
472

W
wangliu 已提交
473
  const vector<float> &Variances() const { return variances_; }
E
eclipsess 已提交
474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489

  const bool &Flip() const { return flip_; }

  const bool &Clip() const { return clip_; }

  const float &StepW() const { return step_w_; }

  const float &StepH() const { return step_h_; }

  const float &Offset() const { return offset_; }

 private:
  Tensor *input_;
  Tensor *input_image_;
  Tensor *output_boxes_;
  Tensor *output_variances_;
W
wangliu 已提交
490 491 492 493
  vector<float> min_sizes_;
  vector<float> max_sizes_;
  vector<float> aspect_ratios_;
  vector<float> variances_;
E
eclipsess 已提交
494 495 496 497 498 499
  bool flip_;
  bool clip_;
  float step_w_;
  float step_h_;
  float offset_;
};
E
eclipsess 已提交
500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528

class BoxCoderParam : public OpParam {
 public:
  BoxCoderParam(const VariableNameMap &inputs, const VariableNameMap &outputs,
                const framework::AttributeMap &attrs,
                const framework::Scope &scope) {
    input_priorbox_ = InputPriorBoxFrom<framework::Tensor>(inputs, scope);
    input_priorboxvar_ = InputPriorBoxVarFrom<framework::Tensor>(inputs, scope);
    input_targetbox_ = InputTargetBoxFrom<framework::Tensor>(inputs, scope);
    output_box_ = OutputBoxFrom<framework::Tensor>(outputs, scope);
    code_type_ = GetAttr<std::string>("code_type", attrs);
  }
  const Tensor *InputPriorBox() const { return input_priorbox_; }

  const Tensor *InputPriorBoxVar() const { return input_priorboxvar_; }

  const Tensor *InputTargetBox() const { return input_targetbox_; }

  Tensor *OutputBox() const { return output_box_; }

  const std::string &CodeType() const { return code_type_; }

 private:
  Tensor *input_priorbox_;
  Tensor *input_priorboxvar_;
  Tensor *input_targetbox_;
  Tensor *output_box_;
  std::string code_type_;
};
W
wangliu 已提交
529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544

class SoftmaxParam : public OpParam {
 public:
  SoftmaxParam(const VariableNameMap &inputs, const VariableNameMap &outputs,
               const framework::AttributeMap &attrs,
               const framework::Scope &scope) {
    input_x_ = InputXFrom<framework::Tensor>(inputs, scope);
    out_ = OutFrom<framework::Tensor>(outputs, scope);
  }
  const Tensor *InputX() const { return input_x_; }
  Tensor *Out() const { return out_; }

 private:
  Tensor *input_x_;
  Tensor *out_;
};
W
wangliu 已提交
545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560

class SigmoidParam : public OpParam {
 public:
  SigmoidParam(const VariableNameMap &inputs, const VariableNameMap &outputs,
               const framework::AttributeMap &attrs,
               const framework::Scope &scope) {
    input_x_ = InputXFrom<framework::Tensor>(inputs, scope);
    out_ = OutFrom<framework::Tensor>(outputs, scope);
  }
  const Tensor *InputX() const { return input_x_; }
  Tensor *Out() const { return out_; }

 private:
  Tensor *input_x_;
  Tensor *out_;
};
E
eclipsess 已提交
561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605
class MultiClassNMSParam : public OpParam {
 public:
  MultiClassNMSParam(const VariableNameMap &inputs,
                     const VariableNameMap &outputs, const AttributeMap &attrs,
                     const Scope &scope) {
    input_bboxes_ = InputBBoxesFrom<Tensor>(inputs, scope);
    input_scores_ = InputScoresFrom<Tensor>(inputs, scope);
    out_ = OutFrom<Tensor>(outputs, scope);
    background_label_ = GetAttr<int>("background_label", attrs);
    nms_top_k_ = GetAttr<int>("nms_top_k", attrs);
    keep_top_k_ = GetAttr<int>("keep_top_k", attrs);
    nms_threshold_ = GetAttr<float>("nms_threshold", attrs);
    nms_eta_ = GetAttr<float>("nms_eta", attrs);
    score_threshold_ = GetAttr<float>("score_threshold", attrs);
  }

  const Tensor *InputBBoxes() const { return input_bboxes_; }

  const Tensor *InputScores() const { return input_scores_; }

  Tensor *Out() const { return out_; }

  const int &BackGroundLabel() const { return background_label_; }

  const int &NMSTopK() const { return nms_top_k_; }

  const int &KeepTopK() const { return keep_top_k_; }

  const float &NMSThreshold() const { return nms_threshold_; }

  const float &NMSEta() const { return nms_eta_; }

  const float &ScoreThreshold() const { return score_threshold_; }

 private:
  Tensor *input_bboxes_;
  Tensor *input_scores_;
  Tensor *out_;
  int background_label_;
  int nms_top_k_;
  int keep_top_k_;
  float nms_threshold_;
  float nms_eta_;
  float score_threshold_;
};
W
wangliu 已提交
606

L
liuruilong 已提交
607 608 609
class FeedParam : public OpParam {
 public:
  FeedParam(const VariableNameMap &inputs, const VariableNameMap &outputs,
L
liuruilong 已提交
610 611
            const framework::AttributeMap &attrs,
            const framework::Scope &scope) {
L
liuruilong 已提交
612 613 614 615 616
    input_x_ = InputXFrom<framework::Tensor>(inputs, scope);
    out_ = OutFrom<framework::Tensor>(outputs, scope);
  }
  const Tensor *InputX() const { return input_x_; }
  Tensor *Out() const { return out_; }
L
liuruilong 已提交
617

L
liuruilong 已提交
618 619 620 621 622 623 624 625
 private:
  Tensor *input_x_;
  Tensor *out_;
};

class FetchParam : public OpParam {
 public:
  FetchParam(const VariableNameMap &inputs, const VariableNameMap &outputs,
L
liuruilong 已提交
626 627
             const framework::AttributeMap &attrs,
             const framework::Scope &scope) {
L
liuruilong 已提交
628 629 630 631 632
    input_x_ = InputXFrom<framework::Tensor>(inputs, scope);
    out_ = OutFrom<framework::Tensor>(outputs, scope);
  }
  const Tensor *InputX() const { return input_x_; }
  Tensor *Out() const { return out_; }
L
liuruilong 已提交
633

L
liuruilong 已提交
634 635 636 637 638
 private:
  Tensor *input_x_;
  Tensor *out_;
};

E
eclipsess 已提交
639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658
class TransposeParam : public OpParam {
 public:
  TransposeParam(const VariableNameMap &inputs, const VariableNameMap &outputs,
                 const AttributeMap &attrs, const Scope &scope) {
    input_x_ = InputXFrom<Tensor>(inputs, scope);
    out_ = OutFrom<Tensor>(outputs, scope);
    axis_ = GetAttr<vector<int>>("axis", attrs);
  }

  const Tensor *InputX() const { return input_x_; }

  Tensor *Out() const { return out_; }

  const vector<int> &Axis() const { return axis_; }

 private:
  Tensor *input_x_;
  Tensor *out_;
  vector<int> axis_;
};
E
eclipsess 已提交
659

E
eclipsess 已提交
660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687
class ReshapeParam : public OpParam {
 public:
  ReshapeParam(const VariableNameMap &inputs, const VariableNameMap &outputs,
               const AttributeMap &attrs, const Scope &scope) {
    input_x_ = InputXFrom<Tensor>(inputs, scope);
    input_shape_ = InputShapeFrom<Tensor>(inputs, scope);
    out_ = OutFrom<Tensor>(outputs, scope);
    shape_ = GetAttr<vector<int>>("shape", attrs);
    inplace_ = GetAttr<bool>("inplace", attrs);
  }

  const Tensor *InputX() const { return input_x_; }

  const Tensor *InputShape() const { return input_shape_; }

  Tensor *Out() const { return out_; }

  const vector<int> &Shape() const { return shape_; }

  const bool &Inplace() const { return inplace_; }

 private:
  Tensor *input_x_;
  Tensor *input_shape_;
  Tensor *out_;
  vector<int> shape_;
  bool inplace_;
};
E
eclipsess 已提交
688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705

class ReluParam : public OpParam {
 public:
  ReluParam(const VariableNameMap &inputs, const VariableNameMap &outputs,
            const AttributeMap &attrs, const Scope &scope) {
    input_x_ = InputXFrom<Tensor>(inputs, scope);
    out_ = OutFrom<Tensor>(outputs, scope);
  }

  const Tensor *InputX() const { return input_x_; }

  Tensor *Out() const { return out_; }

 private:
  Tensor *input_x_;
  Tensor *out_;
};

朔-望's avatar
朔-望 已提交
706 707
}  // namespace operators
}  // namespace paddle_mobile