Skip to content
This repository has been archived by the owner on Nov 17, 2023. It is now read-only.

[MXNET-108] Adding BilinearResize2D and AdaptiveAvgPool2d operators #9688

Merged
merged 47 commits into from
Apr 9, 2018
Merged
Show file tree
Hide file tree
Changes from 40 commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
99e824f
bilinear upsample from PYTorch
zhanghang1989 Feb 3, 2018
3453fd9
fix cpu backward
zhanghang1989 Feb 6, 2018
6085571
fix indent, add req
zhanghang1989 Feb 6, 2018
9dd48a9
fix lint
zhanghang1989 Feb 6, 2018
4bffb27
fix lint
zhanghang1989 Feb 6, 2018
94c1954
lint
zhanghang1989 Feb 7, 2018
52d1905
Merge github.com:apache/incubator-mxnet into bilinear
zhanghang1989 Feb 7, 2018
ecbc23f
handle req
zhanghang1989 Feb 7, 2018
df3ffe9
add adaptive avg pooling operator
zhanghang1989 Feb 7, 2018
86a544b
rename to bilinear resize
zhanghang1989 Mar 3, 2018
aaf19c6
fix name
zhanghang1989 Mar 3, 2018
39c1e14
change assertion
zhanghang1989 Mar 5, 2018
4960f19
rm unused var
zhanghang1989 Mar 5, 2018
294a0b6
Merge github.com:apache/incubator-mxnet into bilinear
zhanghang1989 Mar 5, 2018
531def6
refactor using mshadow tensor
zhanghang1989 Mar 7, 2018
75a1a63
rm devicetensor, only using mshadow
zhanghang1989 Mar 8, 2018
263811c
add docs
zhanghang1989 Mar 8, 2018
74dde72
naming
zhanghang1989 Mar 8, 2018
029c2ad
Merge github.com:apache/incubator-mxnet into bilinear
zhanghang1989 Mar 8, 2018
a2a809a
merge
zhanghang1989 Mar 8, 2018
782d9e9
Revert "merge"
zhanghang1989 Mar 8, 2018
78d61e9
add unit test for BilinearResize2D and AdaptiveAvgPool2D
zhanghang1989 Mar 15, 2018
86c3ecc
Merge https://github.com/apache/incubator-mxnet into bilinear
zhanghang1989 Mar 15, 2018
f294e0d
for test in python2, cast into float
zhanghang1989 Mar 15, 2018
9944a21
mv function inside
zhanghang1989 Mar 16, 2018
ca90284
link docs
zhanghang1989 Mar 19, 2018
fecc7f0
address the comments
zhanghang1989 Mar 19, 2018
bb32d2a
lint
zhanghang1989 Mar 19, 2018
7a7ce04
add back private ()
zhanghang1989 Mar 19, 2018
001c16b
correct lint
zhanghang1989 Mar 19, 2018
9c8f87a
decleare var
zhanghang1989 Mar 19, 2018
ac4aa0d
link params docs
zhanghang1989 Mar 20, 2018
d645182
fix bug
zhanghang1989 Mar 20, 2018
626cb33
mv to contrib and upodate docs
zhanghang1989 Mar 21, 2018
9dbdb8e
Merge https://github.com/apache/incubator-mxnet into bilinear
zhanghang1989 Mar 21, 2018
7a69e54
contrib header
zhanghang1989 Mar 21, 2018
15848a7
change include path for contrib
zhanghang1989 Mar 21, 2018
7b5163b
lint
zhanghang1989 Mar 21, 2018
7430365
register to contrib
zhanghang1989 Mar 22, 2018
5c6ccf5
lint
zhanghang1989 Mar 22, 2018
033a675
rename width, height, docs
zhanghang1989 Mar 22, 2018
eb59dc3
Merge https://github.com/apache/incubator-mxnet into bilinear
zhanghang1989 Mar 22, 2018
916ec0d
rename param
zhanghang1989 Mar 22, 2018
2ce32ab
Patch1 (#1)
zhanghang1989 Apr 9, 2018
89aa321
Merge https://github.com/apache/incubator-mxnet into bilinear
zhanghang1989 Apr 9, 2018
3baea36
lint
zhanghang1989 Apr 9, 2018
dea3295
lint
zhanghang1989 Apr 9, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions docs/api/python/ndarray/contrib.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ In the rest of this document, we list routines provided by the `ndarray.contrib`
.. autosummary::
:nosignatures:

AdaptiveAvgPooling2D
BilinearResize2D
CTCLoss
DeformableConvolution
DeformablePSROIPooling
Expand Down
2 changes: 2 additions & 0 deletions docs/api/python/symbol/contrib.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ In the rest of this document, we list routines provided by the `symbol.contrib`
.. autosummary::
:nosignatures:

AdaptiveAvgPooling2D
BilinearResize2D
CTCLoss
DeformableConvolution
DeformablePSROIPooling
Expand Down
184 changes: 184 additions & 0 deletions src/operator/contrib/adaptive_avg_pooling-inl.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,184 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
/*!
* Copyright (c) 2018 by Contributors
* \file adaptive_avg_pooling-inl.h
* \brief adaptive average pooling operator
* \author Hang Zhang
*/
#ifndef MXNET_OPERATOR_CONTRIB_ADAPTIVE_AVG_POOLING_INL_H_
#define MXNET_OPERATOR_CONTRIB_ADAPTIVE_AVG_POOLING_INL_H_

#include <dmlc/logging.h>
#include <dmlc/parameter.h>
#include <mxnet/operator.h>
#include <mxnet/ndarray.h>
#include <map>
#include <vector>
#include <string>
#include <utility>
/* contrib
#include "../ndarray/ndarray_function.h"
#include "./operator_common.h"
#include "./mxnet_op.h"
#include "./mshadow_op.h"
*/
#include "../../ndarray/ndarray_function.h"
#include "../operator_common.h"
#include "../mxnet_op.h"
#include "../mshadow_op.h"

namespace mxnet {
namespace op {

struct AdaptiveAvgPoolParam : public dmlc::Parameter<AdaptiveAvgPoolParam> {
int output_size;
DMLC_DECLARE_PARAMETER(AdaptiveAvgPoolParam) {
DMLC_DECLARE_FIELD(output_size).set_range(1, 1000)
.describe("output size");
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

expand the doc

}
};

static inline bool IsWriting(const OpReqType ort) {
return ort == kWriteTo || ort == kWriteInplace;
}

template<typename xpu, typename DType, typename AccReal>
void AdaptiveAvgPoolUpdateOutput(mshadow::Stream<cpu> *s,
const std::vector<TBlob> &input,
const std::vector<TBlob> &output);

template<typename xpu, typename DType, typename AccReal>
void AdaptiveAvgPoolUpdateGradInput(mshadow::Stream<cpu> *s,
const std::vector<TBlob> &input,
const std::vector<TBlob> &output);

#if MXNET_USE_CUDA
template<typename xpu, typename DType, typename AccReal>
void AdaptiveAvgPoolUpdateOutput(mshadow::Stream<gpu> *s,
const std::vector<TBlob> &input,
const std::vector<TBlob> &output);

template<typename xpu, typename DType, typename AccReal>
void AdaptiveAvgPoolUpdateGradInput(mshadow::Stream<gpu> *s,
const std::vector<TBlob> &input,
const std::vector<TBlob> &output);
#endif // MXNET_USE_CUDA

template <typename xpu>
inline void AdaptiveAvgPoolOpForward(const nnvm::NodeAttrs& attrs,
const OpContext &ctx,
const std::vector<TBlob> &inputs,
const std::vector<OpReqType> &req,
const std::vector<TBlob> &outputs) {
CHECK_EQ(inputs.size(), 1U);
CHECK_EQ(outputs.size(), 1U);
mshadow::Stream<xpu> *s = ctx.get_stream<xpu>();
MSHADOW_REAL_TYPE_SWITCH_EX(inputs[0].type_flag_, DType, AccReal, {
AdaptiveAvgPoolUpdateOutput<xpu, DType, AccReal>(s, inputs, outputs);
});
}


template <typename xpu>
inline void AdaptiveAvgPoolOpBackward(const nnvm::NodeAttrs& attrs,
const OpContext &ctx,
const std::vector<TBlob> &inputs,
const std::vector<OpReqType> &req,
const std::vector<TBlob> &outputs) {
CHECK_EQ(inputs.size(), 1U);
CHECK_EQ(outputs.size(), 1U);
mshadow::Stream<xpu> *s = ctx.get_stream<xpu>();
if (IsWriting(req[0])) {
// zero grad before backwarding
MSHADOW_TYPE_SWITCH(inputs[0].type_flag_, DType, {
Fill<false>(s, outputs[0], kWriteTo, 0);
})
}
MSHADOW_REAL_TYPE_SWITCH_EX(inputs[0].type_flag_, DType, AccReal, {
AdaptiveAvgPoolUpdateGradInput<xpu, DType, AccReal>(s, inputs, outputs);
});
}


static bool AdaptiveAvgPoolOpInferShape(const nnvm::NodeAttrs& attrs,
std::vector<TShape> *in_shape,
std::vector<TShape> *out_shape) {
using namespace mshadow;
CHECK_EQ(in_shape->size(), 1U) << "Input:[data]";
CHECK_EQ(out_shape->size(), 1U) << "Output:[data]";
const AdaptiveAvgPoolParam& param = nnvm::get<AdaptiveAvgPoolParam>(attrs.parsed);
TShape dshape(in_shape->at(0));
if (dshape.ndim() == 0) return false;
dshape[2] = param.output_size;
dshape[3] = param.output_size;
out_shape->clear();
out_shape->push_back(dshape);
return true;
}

static bool AdaptiveAvgPoolOpInferType(const nnvm::NodeAttrs& attrs,
std::vector<int> *in_type,
std::vector<int> *out_type) {
using namespace mshadow;
CHECK_EQ(in_type->size(), 1U);
int dtype = (*in_type)[0];
CHECK_NE(dtype, -1) << "First input must have specified type";
// For float16 input type beta, gamma, mean, and average are stored in float32.
// For other input types, these parameters have the same type as input
// NOTE: This requirement is from cuDNN (v. 4 and 5)
int dtype_param = 0;
MSHADOW_REAL_TYPE_SWITCH_EX(dtype, DTypeX, AccRealX, {
dtype_param = mshadow::DataType<AccRealX>::kFlag; });
out_type->clear();
out_type->push_back(dtype_param);
return true;
}

static inline bool AdaptiveAvgPoolOpStorageType(const nnvm::NodeAttrs &attrs,
const int dev_mask,
DispatchMode *dispatch_mode,
std::vector<int> *in_attrs,
std::vector<int> *out_attrs) {
CHECK_EQ(in_attrs->size(), 1);
CHECK_EQ(out_attrs->size(), 1);
*dispatch_mode = DispatchMode::kFCompute;
for (int& v : *in_attrs) {
if (v == - 1) v = kDefaultStorage;
}
for (size_t i = 0; i < out_attrs->size(); i++) {
(*out_attrs)[i] = kDefaultStorage;
}
return true;
}

using namespace mshadow;
template<typename xpu, int Dim, typename DType>
MSHADOW_XINLINE int get_stride(Tensor<xpu, Dim, DType> tensor, int idx) {
int stride = 1;
for (int i = Dim-2; i >= idx; --i) {
stride *= tensor.size(i+1);
}
return stride;
}

} // namespace op
} // namespace mxnet

#endif // MXNET_OPERATOR_CONTRIB_ADAPTIVE_AVG_POOLING_INL_H_
Loading