This repository has been archived by the owner on Nov 17, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 6.8k
[MXNET-108] Adding BilinearResize2D and AdaptiveAvgPool2d operators #9688
Merged
Merged
Changes from 33 commits
Commits
Show all changes
47 commits
Select commit
Hold shift + click to select a range
99e824f
bilinear upsample from PYTorch
zhanghang1989 3453fd9
fix cpu backward
zhanghang1989 6085571
fix indent, add req
zhanghang1989 9dd48a9
fix lint
zhanghang1989 4bffb27
fix lint
zhanghang1989 94c1954
lint
zhanghang1989 52d1905
Merge github.com:apache/incubator-mxnet into bilinear
zhanghang1989 ecbc23f
handle req
zhanghang1989 df3ffe9
add adaptive avg pooling operator
zhanghang1989 86a544b
rename to bilinear resize
zhanghang1989 aaf19c6
fix name
zhanghang1989 39c1e14
change assertion
zhanghang1989 4960f19
rm unused var
zhanghang1989 294a0b6
Merge github.com:apache/incubator-mxnet into bilinear
zhanghang1989 531def6
refactor using mshadow tensor
zhanghang1989 75a1a63
rm devicetensor, only using mshadow
zhanghang1989 263811c
add docs
zhanghang1989 74dde72
naming
zhanghang1989 029c2ad
Merge github.com:apache/incubator-mxnet into bilinear
zhanghang1989 a2a809a
merge
zhanghang1989 782d9e9
Revert "merge"
zhanghang1989 78d61e9
add unit test for BilinearResize2D and AdaptiveAvgPool2D
zhanghang1989 86c3ecc
Merge https://github.com/apache/incubator-mxnet into bilinear
zhanghang1989 f294e0d
for test in python2, cast into float
zhanghang1989 9944a21
mv function inside
zhanghang1989 ca90284
link docs
zhanghang1989 fecc7f0
address the comments
zhanghang1989 bb32d2a
lint
zhanghang1989 7a7ce04
add back private ()
zhanghang1989 001c16b
correct lint
zhanghang1989 9c8f87a
decleare var
zhanghang1989 ac4aa0d
link params docs
zhanghang1989 d645182
fix bug
zhanghang1989 626cb33
mv to contrib and upodate docs
zhanghang1989 9dbdb8e
Merge https://github.com/apache/incubator-mxnet into bilinear
zhanghang1989 7a69e54
contrib header
zhanghang1989 15848a7
change include path for contrib
zhanghang1989 7b5163b
lint
zhanghang1989 7430365
register to contrib
zhanghang1989 5c6ccf5
lint
zhanghang1989 033a675
rename width, height, docs
zhanghang1989 eb59dc3
Merge https://github.com/apache/incubator-mxnet into bilinear
zhanghang1989 916ec0d
rename param
zhanghang1989 2ce32ab
Patch1 (#1)
zhanghang1989 89aa321
Merge https://github.com/apache/incubator-mxnet into bilinear
zhanghang1989 3baea36
lint
zhanghang1989 dea3295
lint
zhanghang1989 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,178 @@ | ||
/* | ||
* 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_ADAPTIVE_AVG_POOLING_INL_H_ | ||
#define MXNET_OPERATOR_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> | ||
#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"); | ||
} | ||
}; | ||
|
||
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_ADAPTIVE_AVG_POOLING_INL_H_ |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
AdaptiveAvgPooling2D