1 #include "caffe2/operators/clip_op.h" 6 bool ClipOp<float, CPUContext>::RunOnDevice() {
10 EigenVectorMap<float>(Y->mutable_data<
float>(), Y->size()) =
11 ConstEigenVectorMap<float>(X.data<
float>(), X.size())
18 bool ClipGradientOp<float, CPUContext>::RunOnDevice() {
22 CAFFE_ENFORCE_GT(Y.size(), 0);
23 CAFFE_ENFORCE_EQ(dY.size(), Y.size());
25 const float* Ydata = Y.data<
float>();
26 const float* dYdata = dY.data<
float>();
27 float* dXdata = dX->mutable_data<
float>();
28 for (
int i = 0; i < Y.size(); ++i) {
29 dXdata[i] = dYdata[i] * (Ydata[i] > min_ && Ydata[i] < max_);
34 REGISTER_CPU_OPERATOR(Clip, ClipOp<float, CPUContext>);
35 REGISTER_CPU_OPERATOR(ClipGradient, ClipGradientOp<float, CPUContext>);
40 .AllowInplace({{0, 0}})
41 .IdenticalTypeAndShape()
43 Clip operator limits the given input within an interval. The interval is 44 specified with arguments 'min' and 'max'. They default to 45 numeric_limits::lowest() and numeric_limits::max() respectively. The clipping 46 operation can be done in in-place fashion too, where the input and output blobs 49 .Arg("min",
"Minimum value, under which element is replaced by min")
50 .Arg(
"max",
"Maximum value, above which element is replaced by max")
54 "Input tensor (Tensor<float>) containing elements to be" 59 "Output tensor (Tensor<float>) containing clipped" 61 .InheritOnnxSchema(
"Clip");
63 OPERATOR_SCHEMA(ClipGradient).NumInputs(2).NumOutputs(1).AllowInplace({{1, 0}});
65 class GetClipGradient :
public GradientMakerBase {
66 using GradientMakerBase::GradientMakerBase;
67 vector<OperatorDef> GetGradientDefs()
override {
68 return SingleGradientDef(
70 vector<string>{O(0), GO(0)},
71 vector<string>{GI(0)});
74 REGISTER_GRADIENT(Clip, GetClipGradient);
A global dictionary that holds information about what Caffe2 modules have been loaded in the current ...