pool2d_op.cc 3.3 KB
Newer Older
N
nhzlx 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
/* 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. */

#include "paddle/fluid/inference/tensorrt/convert/op_converter.h"

namespace paddle {
namespace inference {
namespace tensorrt {

/*
 * Pool2dOp, IPoolingLayer in TRT. This Layer doesn't has weights.
 */
class Pool2dOpConverter : public OpConverter {
 public:
  void operator()(const framework::proto::OpDesc& op,
                  const framework::Scope& scope, bool test_mode) override {
    VLOG(4)
        << "convert a fluid pool2d op to tensorrt pool2d layer without bias";
    framework::OpDesc op_desc(op, nullptr);
    // Declare inputs
N
nhzlx 已提交
32 33
    PADDLE_ENFORCE_EQ(op_desc.Input("X").size(), 1);
    PADDLE_ENFORCE_EQ(op_desc.Output("Out").size(), 1);
N
nhzlx 已提交
34
    auto* input1 = engine_->GetITensor(op_desc.Input("X")[0]);
N
nhzlx 已提交
35

N
nhzlx 已提交
36
    bool global_pooling = boost::get<bool>(op_desc.GetAttr("global_pooling"));
N
nhzlx 已提交
37 38 39 40 41 42 43 44 45
    std::string pool_type =
        boost::get<std::string>(op_desc.GetAttr("pooling_type"));
    std::vector<int> ksize =
        boost::get<std::vector<int>>(op_desc.GetAttr("ksize"));
    std::vector<int> strides =
        boost::get<std::vector<int>>(op_desc.GetAttr("strides"));
    std::vector<int> paddings =
        boost::get<std::vector<int>>(op_desc.GetAttr("paddings"));

N
nhzlx 已提交
46 47 48 49 50 51 52
    nvinfer1::DimsHW nv_ksize(ksize[0], ksize[1]);
    if (global_pooling == true) {
      nvinfer1::Dims input_shape = input1->getDimensions();
      int nbDims = input_shape.nbDims;
      nv_ksize.d[0] = input_shape.d[nbDims - 2];
      nv_ksize.d[1] = input_shape.d[nbDims - 1];
    }
N
nhzlx 已提交
53 54 55
    const nvinfer1::DimsHW nv_strides(strides[0], strides[1]);
    const nvinfer1::DimsHW nv_paddings(paddings[0], paddings[1]);

56 57
    PADDLE_ENFORCE_EQ(input1->getDimensions().nbDims, 3UL);

N
nhzlx 已提交
58
    nvinfer1::PoolingType nv_pool_type = nvinfer1::PoolingType::kMAX;
N
nhzlx 已提交
59
    if (pool_type == "max") {
N
nhzlx 已提交
60
      nv_pool_type = nvinfer1::PoolingType::kMAX;
N
nhzlx 已提交
61
    } else if (pool_type == "avg") {
N
nhzlx 已提交
62
      nv_pool_type = nvinfer1::PoolingType::kAVERAGE;
N
nhzlx 已提交
63 64 65 66 67 68
    } else {
      PADDLE_THROW("TensorRT unsupported pooling type!");
    }

    auto* layer = TRT_ENGINE_ADD_LAYER(engine_, Pooling,
                                       *const_cast<nvinfer1::ITensor*>(input1),
N
nhzlx 已提交
69
                                       nv_pool_type, nv_ksize);
N
nhzlx 已提交
70 71 72 73 74
    PADDLE_ENFORCE_NOT_NULL(layer, "pool layer could not be created.");
    layer->setStride(nv_strides);
    layer->setPadding(nv_paddings);

    auto output_name = op_desc.Output("Out")[0];
75 76
    layer->setName(("pool2d (Output: " + output_name + ")").c_str());
    layer->getOutput(0)->setName(output_name.c_str());
N
nhzlx 已提交
77 78 79 80 81 82 83 84 85 86 87 88 89
    engine_->SetITensor(output_name, layer->getOutput(0));
    if (test_mode) {
      engine_->DeclareOutput(output_name);
    }
  }
};

}  // namespace tensorrt
}  // namespace inference
}  // namespace paddle

USE_OP(pool2d);
REGISTER_TRT_OP_CONVERTER(pool2d, Pool2dOpConverter);