activation_op.cc 20.0 KB
Newer Older
1
/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved.
Q
qijun 已提交
2

L
Luo Tao 已提交
3 4 5
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
Q
qijun 已提交
6

L
Luo Tao 已提交
7
    http://www.apache.org/licenses/LICENSE-2.0
Q
qijun 已提交
8

L
Luo Tao 已提交
9 10 11 12 13
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. */
Q
qijun 已提交
14

Y
Yi Wang 已提交
15
#include "paddle/fluid/operators/activation_op.h"
T
tink2123 已提交
16
#include <memory>
D
dzhwinter 已提交
17
#include <string>
T
tink2123 已提交
18
#include <unordered_map>
19
#include "paddle/fluid/operators/mkldnn/mkldnn_activation_op.h"
D
dzhwinter 已提交
20
#include "paddle/fluid/platform/port.h"
21 22 23
#ifdef PADDLE_WITH_CUDA
#include "paddle/fluid/platform/cudnn_helper.h"
#endif
Q
qijun 已提交
24 25 26 27

namespace paddle {
namespace operators {

28 29
using paddle::framework::Tensor;

30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
#define REGISTER_ACTIVATION_OP_MAKER(OP_NAME, OP_COMMENT)                    \
  class OP_NAME##OpMaker                                                     \
      : public ::paddle::framework::OpProtoAndCheckerMaker {                 \
   public:                                                                   \
    void Make() override {                                                   \
      AddInput("X", "Input of " #OP_NAME " operator");                       \
      AddOutput("Out", "Output of " #OP_NAME " operator");                   \
      AddAttr<bool>("use_mkldnn",                                            \
                    "(bool, default false) Only used in mkldnn kernel")      \
          .SetDefault(false);                                                \
      AddAttr<bool>("use_cudnn",                                             \
                    "(bool, default false) Only used in cudnn kernel, need " \
                    "install cudnn")                                         \
          .SetDefault(false);                                                \
      AddAttr<bool>(                                                         \
          "is_test",                                                         \
          "(bool, default false) Set to true for inference only, false "     \
          "for training. Some layers may run faster when this is true.")     \
          .SetDefault(false);                                                \
      AddComment(OP_COMMENT);                                                \
    }                                                                        \
D
dzhwinter 已提交
51
  }
D
dzhwinter 已提交
52 53 54 55 56 57 58 59 60

#define REGISTER_ACTIVATION_OP_GRAD_MAKER(OP_NAME, KERNEL_TYPE)              \
  class OP_NAME##GradMaker                                                   \
      : public ::paddle::framework::SingleGradOpDescMaker {                  \
   public:                                                                   \
    using ::paddle::framework::SingleGradOpDescMaker::SingleGradOpDescMaker; \
                                                                             \
   protected:                                                                \
    std::unique_ptr<::paddle::framework::OpDesc> Apply() const override {    \
61
      auto* op = new ::paddle::framework::OpDesc();                          \
D
dzhwinter 已提交
62 63 64 65 66 67 68 69 70 71
      op->SetType(#KERNEL_TYPE "_grad");                                     \
      op->SetInput("Out", Output("Out"));                                    \
      op->SetInput(::paddle::framework::GradVarName("Out"),                  \
                   OutputGrad("Out"));                                       \
                                                                             \
      op->SetAttrMap(Attrs());                                               \
                                                                             \
      op->SetOutput(::paddle::framework::GradVarName("X"), InputGrad("X"));  \
      return std::unique_ptr<::paddle::framework::OpDesc>(op);               \
    }                                                                        \
D
dzhwinter 已提交
72
  }
D
dzhwinter 已提交
73

74 75 76 77
framework::OpKernelType GetKernelType(const framework::ExecutionContext& ctx,
                                      const framework::OperatorWithKernel& oper,
                                      const std::string& name) {
  framework::LibraryType library{framework::LibraryType::kPlain};
M
mozga-intel 已提交
78
  framework::DataLayout layout = framework::DataLayout::kAnyLayout;
79 80 81 82 83 84
#ifdef PADDLE_WITH_CUDA
  auto it1 = oper.Attrs().find("use_cudnn");
  if (it1 != oper.Attrs().end() && platform::CanCUDNNBeUsed(ctx)) {
    library = framework::LibraryType::kCUDNN;
  }
#endif
85 86 87 88 89
#ifdef PADDLE_WITH_MKLDNN
  auto it = oper.Attrs().find("use_mkldnn");
  if (library == framework::LibraryType::kPlain && it != oper.Attrs().end() &&
      platform::CanMKLDNNBeUsed(ctx)) {
    library = framework::LibraryType::kMKLDNN;
M
mozga-intel 已提交
90
    layout = framework::DataLayout::kMKLDNN;
91 92 93
  }
#endif
  return framework::OpKernelType(
C
chengduo 已提交
94 95
      framework::GetDataTypeOfVar(ctx.InputVar(name)), ctx.GetPlace(), layout,
      library);
96 97
}

Q
qijun 已提交
98 99 100 101
class ActivationOp : public framework::OperatorWithKernel {
 public:
  using framework::OperatorWithKernel::OperatorWithKernel;

102
  void InferShape(framework::InferShapeContext* ctx) const override {
103
    ctx->ShareDim("X", /*->*/ "Out");
F
fengjiayi 已提交
104
    ctx->ShareLoD("X", /*->*/ "Out");
Q
qijun 已提交
105
  }
106

107
 protected:
108 109 110 111
  framework::OpKernelType GetExpectedKernelType(
      const framework::ExecutionContext& ctx) const override {
    return GetKernelType(ctx, *this, "X");
  }
Q
qijun 已提交
112 113
};

C
chengduo 已提交
114 115 116 117 118 119
class ActivationOpInferVarType
    : public framework::PassInDtypeAndVarTypeToOutput {
 protected:
  std::unordered_map<std::string, std::string> GetInputOutputWithSameType()
      const override {
    return std::unordered_map<std::string, std::string>{{"X", /*->*/ "Out"}};
120 121 122
  }
};

Q
qijun 已提交
123 124 125 126
class ActivationOpGrad : public framework::OperatorWithKernel {
 public:
  using framework::OperatorWithKernel::OperatorWithKernel;

127
  void InferShape(framework::InferShapeContext* ctx) const override {
128 129
    ctx->ShareDim("Out", framework::GradVarName("X"));
    ctx->ShareLoD("Out", framework::GradVarName("X"));
Q
qijun 已提交
130
  }
131

132
 protected:
133 134 135 136
  framework::OpKernelType GetExpectedKernelType(
      const framework::ExecutionContext& ctx) const override {
    return GetKernelType(ctx, *this, "Out");
  }
Q
qijun 已提交
137 138
};

D
dzhwinter 已提交
139
UNUSED constexpr char SigmoidDoc[] = R"DOC(
140
Sigmoid Activation Operator
K
Kexin Zhao 已提交
141

142
$$out = \\frac{1}{1 + e^{-x}}$$
K
Kexin Zhao 已提交
143

D
dzhwinter 已提交
144
)DOC";
Q
qijun 已提交
145

D
dzhwinter 已提交
146
UNUSED constexpr char LogSigmoidDoc[] = R"DOC(
147
Logsigmoid Activation Operator
K
Kexin Zhao 已提交
148

149
$$out = \\log \\frac{1}{1 + e^{-x}}$$
K
Kexin Zhao 已提交
150

D
dzhwinter 已提交
151
)DOC";
152

D
dzhwinter 已提交
153
UNUSED constexpr char ExpDoc[] = R"DOC(
K
kexinzhao 已提交
154
Exp Activation Operator.
K
Kexin Zhao 已提交
155

F
fengjiayi 已提交
156
$out = e^x$
K
Kexin Zhao 已提交
157

D
dzhwinter 已提交
158
)DOC";
Q
qijun 已提交
159

D
dzhwinter 已提交
160
UNUSED constexpr char ReluDoc[] = R"DOC(
K
kexinzhao 已提交
161
Relu Activation Operator.
K
Kexin Zhao 已提交
162

F
fengjiayi 已提交
163
$out = \max(x, 0)$
K
Kexin Zhao 已提交
164

D
dzhwinter 已提交
165
)DOC";
K
Kexin Zhao 已提交
166

C
Clementine 已提交
167 168 169 170 171 172 173
UNUSED constexpr char GeluDoc[] = R"DOC(
Gelu Activation Operator.

$out = \\frac{1 + erf(\\frac{x}{\\sqrt{2}})}{2} x$

)DOC";

D
dzhwinter 已提交
174
UNUSED constexpr char TanhDoc[] = R"DOC(
K
kexinzhao 已提交
175
Tanh Activation Operator.
K
Kexin Zhao 已提交
176

Q
update  
qiaolongfei 已提交
177
$$out = \\frac{e^{x} - e^{-x}}{e^{x} + e^{-x}}$$
K
Kexin Zhao 已提交
178

D
dzhwinter 已提交
179
)DOC";
180

D
dzhwinter 已提交
181
UNUSED constexpr char TanhShrinkDoc[] = R"DOC(
K
kexinzhao 已提交
182
TanhShrink Activation Operator.
K
Kexin Zhao 已提交
183

Y
Yan Chunwei 已提交
184
$$out = x - \\frac{e^{x} - e^{-x}}{e^{x} + e^{-x}}$$
K
Kexin Zhao 已提交
185

D
dzhwinter 已提交
186
)DOC";
K
Kexin Zhao 已提交
187

D
dzhwinter 已提交
188
UNUSED constexpr char SqrtDoc[] = R"DOC(
K
kexinzhao 已提交
189
Sqrt Activation Operator.
K
Kexin Zhao 已提交
190

F
fengjiayi 已提交
191
$out = \sqrt{x}$
K
Kexin Zhao 已提交
192

D
dzhwinter 已提交
193
)DOC";
194

D
dzhwinter 已提交
195
UNUSED constexpr char AbsDoc[] = R"DOC(
K
kexinzhao 已提交
196
Abs Activation Operator.
K
Kexin Zhao 已提交
197

F
fengjiayi 已提交
198
$out = |x|$
K
Kexin Zhao 已提交
199

D
dzhwinter 已提交
200
)DOC";
201

D
dzhwinter 已提交
202
UNUSED constexpr char CeilDoc[] = R"DOC(
D
dzhwinter 已提交
203 204
Ceil Activation Operator.

205
$out = \left \lceil x \right \rceil$
D
dzhwinter 已提交
206

D
dzhwinter 已提交
207
)DOC";
D
dzhwinter 已提交
208

D
dzhwinter 已提交
209
UNUSED constexpr char FloorDoc[] = R"DOC(
D
dzhwinter 已提交
210 211
Floor Activation Operator.

212
$out = \left \lfloor x \right \rfloor$
D
dzhwinter 已提交
213

D
dzhwinter 已提交
214
)DOC";
D
dzhwinter 已提交
215

D
dzhwinter 已提交
216
UNUSED constexpr char CosDoc[] = R"DOC(
C
add sin  
chengduoZH 已提交
217
Cosine Activation Operator.
C
add cos  
chengduoZH 已提交
218 219 220

$out = cos(x)$

D
dzhwinter 已提交
221
)DOC";
C
add cos  
chengduoZH 已提交
222

D
dzhwinter 已提交
223
UNUSED constexpr char SinDoc[] = R"DOC(
C
add sin  
chengduoZH 已提交
224 225 226 227
Sine Activation Operator.

$out = sin(x)$

D
dzhwinter 已提交
228
)DOC";
C
add sin  
chengduoZH 已提交
229

D
dzhwinter 已提交
230
UNUSED constexpr char RoundDoc[] = R"DOC(
D
dzhwinter 已提交
231 232
Round Activation Operator.

F
fengjiayi 已提交
233
$out = [x]$
D
dzhwinter 已提交
234

D
dzhwinter 已提交
235
)DOC";
D
dzhwinter 已提交
236

D
dzhwinter 已提交
237
UNUSED constexpr char ReciprocalDoc[] = R"DOC(
K
kexinzhao 已提交
238
Reciprocal Activation Operator.
K
Kexin Zhao 已提交
239

240
$$out = \\frac{1}{x}$$
K
Kexin Zhao 已提交
241

D
dzhwinter 已提交
242
)DOC";
243

D
dzhwinter 已提交
244
UNUSED constexpr char LogDoc[] = R"DOC(
K
kexinzhao 已提交
245
Log Activation Operator.
K
Kexin Zhao 已提交
246

F
fengjiayi 已提交
247
$out = \ln(x)$
K
Kexin Zhao 已提交
248 249 250

Natural logarithm of x.

D
dzhwinter 已提交
251 252
)DOC";

D
dzhwinter 已提交
253
UNUSED constexpr char SquareDoc[] = R"DOC(
D
dzhwinter 已提交
254 255 256
Square Activation Operator.

$out = x^2$
257

D
dzhwinter 已提交
258 259
)DOC";

D
dzhwinter 已提交
260
UNUSED constexpr char SoftplusDoc[] = R"DOC(
D
dzhwinter 已提交
261 262 263 264 265 266
Softplus Activation Operator.

$out = \ln(1 + e^{x})$

)DOC";

D
dzhwinter 已提交
267
UNUSED constexpr char SoftsignDoc[] = R"DOC(
D
dzhwinter 已提交
268 269
Softsign Activation Operator.

270
$$out = \\frac{x}{1 + \|x\|}$$
D
dzhwinter 已提交
271 272 273

)DOC";

T
tink2123 已提交
274 275 276 277 278 279
class AcosOpMaker : public framework::OpProtoAndCheckerMaker {
 public:
  void Make() override {
    AddInput("X", "Input of acos operator");
    AddOutput("Out", "Output of acos operator");
    AddComment(R"DOC(
280 281
Arccosine Activation Operator.

T
tink2123 已提交
282
$$out = \cos^{-1}(x)$$
283

T
tink2123 已提交
284 285 286
)DOC");
  }
};
287

T
tink2123 已提交
288 289 290 291 292 293
class AsinOpMaker : public framework::OpProtoAndCheckerMaker {
 public:
  void Make() override {
    AddInput("X", "Input of asin operator");
    AddOutput("Out", "Output of asin operator");
    AddComment(R"DOC(
294 295
Arcsine Activation Operator.

T
tink2123 已提交
296
$$out = \sin^{-1}(x)$$
297

T
tink2123 已提交
298 299 300
)DOC");
  }
};
301

T
tink2123 已提交
302 303 304 305 306 307
class AtanOpMaker : public framework::OpProtoAndCheckerMaker {
 public:
  void Make() override {
    AddInput("X", "Input of atan operator");
    AddOutput("Out", "Output of atan operator");
    AddComment(R"DOC(
308 309
Arctanh Activation Operator.

T
tink2123 已提交
310
$$out = \tanh^{-1}(x)$$
311

T
tink2123 已提交
312 313 314
)DOC");
  }
};
315

D
dzhwinter 已提交
316
class LeakyReluOpMaker : public framework::OpProtoAndCheckerMaker {
317
 public:
Y
Yu Yang 已提交
318
  void Make() override {
D
dzhwinter 已提交
319 320 321
    AddInput("X", "Input of LeakyRelu operator");
    AddOutput("Out", "Output of LeakyRelu operator");
    AddAttr<float>("alpha", "The small negative slope").SetDefault(0.02f);
K
Kexin Zhao 已提交
322
    AddComment(R"DOC(
D
dzhwinter 已提交
323
LeakyRelu Activation Operator.
K
Kexin Zhao 已提交
324

D
dzhwinter 已提交
325
$out = \max(x, \alpha * x)$
K
Kexin Zhao 已提交
326 327

)DOC");
328 329 330
  }
};

D
dzhwinter 已提交
331
class SoftShrinkOpMaker : public framework::OpProtoAndCheckerMaker {
K
kexinzhao 已提交
332
 public:
Y
Yu Yang 已提交
333
  void Make() override {
D
dzhwinter 已提交
334 335 336
    AddInput("X", "Input of Softshrink operator");
    AddOutput("Out", "Output of Softshrink operator");
    AddAttr<float>("lambda", "non-negative offset").SetDefault(0.5f);
K
Kexin Zhao 已提交
337
    AddComment(R"DOC(
338 339 340
:strong:`Softshrink Activation Operator`

..  math::
341
    out = \begin{cases}
342 343 344 345
         x - \lambda, \text{if } x > \lambda \\
         x + \lambda, \text{if } x < -\lambda \\
         0,  \text{otherwise}
         \end{cases}
K
Kexin Zhao 已提交
346 347

)DOC");
K
kexinzhao 已提交
348 349 350
  }
};

D
dzhwinter 已提交
351
class HardShrinkOpMaker : public framework::OpProtoAndCheckerMaker {
352
 public:
Y
Yu Yang 已提交
353
  void Make() override {
D
dzhwinter 已提交
354 355
    AddInput("X", "Input of HardShrink operator");
    AddOutput("Out", "Output of HardShrink operator");
Y
yuyang18 已提交
356 357
    AddAttr<float>("threshold",
                   "The value of threshold for HardShrink. [default: 0.5]")
D
dzhwinter 已提交
358
        .SetDefault(0.5f);
K
Kexin Zhao 已提交
359
    AddComment(R"DOC(
Y
yuyang18 已提交
360
:strong:`HardShrink activation operator`
K
Kexin Zhao 已提交
361

Y
yuyang18 已提交
362 363 364 365 366 367
..  math::
    out = \begin{cases}
            x, \text{if } x > \lambda \\
            x, \text{if } x < -\lambda \\
            0,  \text{otherwise}
          \end{cases}
K
Kexin Zhao 已提交
368 369

)DOC");
370 371 372
  }
};

373 374
class BReluOpMaker : public framework::OpProtoAndCheckerMaker {
 public:
Y
Yu Yang 已提交
375
  void Make() override {
376
    AddInput("X", "Input of BRelu operator");
F
fengjiayi 已提交
377
    AddOutput("Out", "Output of BRelu operator");
378 379 380 381
    AddAttr<float>("t_min", "The min marginal value of BRelu")
        .SetDefault(static_cast<float>(0));
    AddAttr<float>("t_max", "The max marginal value of BRelu")
        .SetDefault(static_cast<float>(24));
K
Kexin Zhao 已提交
382
    AddComment(R"DOC(
K
kexinzhao 已提交
383
BRelu Activation Operator.
K
Kexin Zhao 已提交
384

F
fengjiayi 已提交
385
$out = \max(\min(x, t_{min}), t_{max})$
K
Kexin Zhao 已提交
386 387

)DOC");
388 389 390 391 392
  }
};

class SoftReluOpMaker : public framework::OpProtoAndCheckerMaker {
 public:
Y
Yu Yang 已提交
393
  void Make() override {
394
    AddInput("X", "Input of SoftRelu operator");
F
fengjiayi 已提交
395
    AddOutput("Out", "Output of SoftRelu operator");
396 397
    AddAttr<float>("threshold", "The threshold value of SoftRelu")
        .SetDefault(40.0f);
K
Kexin Zhao 已提交
398
    AddComment(R"DOC(
K
kexinzhao 已提交
399
SoftRelu Activation Operator.
K
Kexin Zhao 已提交
400

F
fengjiayi 已提交
401
$out = \ln(1 + \exp(\max(\min(x, threshold), threshold))$
K
Kexin Zhao 已提交
402 403

)DOC");
404 405 406
  }
};

407 408
class ELUOpMaker : public framework::OpProtoAndCheckerMaker {
 public:
Y
Yu Yang 已提交
409
  void Make() override {
K
Kexin Zhao 已提交
410
    AddInput("X", "Input of ELU operator");
F
fengjiayi 已提交
411
    AddOutput("Out", "Output of ELU operator");
412
    AddAttr<float>("alpha", "The alpha value of ELU").SetDefault(1.0f);
413
    AddComment(R"DOC(
K
kexinzhao 已提交
414
ELU Activation Operator.
K
Kexin Zhao 已提交
415 416 417 418

Applies the following element-wise computation on the input according to
https://arxiv.org/abs/1511.07289.

F
fengjiayi 已提交
419
$out = \max(0, x) + \min(0, \alpha * (e^x - 1))$
K
Kexin Zhao 已提交
420 421

)DOC");
422 423 424
  }
};

425 426
class Relu6OpMaker : public framework::OpProtoAndCheckerMaker {
 public:
Y
Yu Yang 已提交
427
  void Make() override {
428
    AddInput("X", "Input of Relu6 operator");
F
fengjiayi 已提交
429
    AddOutput("Out", "Output of Relu6 operator");
430 431
    AddAttr<float>("threshold", "The threshold value of Relu6")
        .SetDefault(6.0f);
K
Kexin Zhao 已提交
432
    AddComment(R"DOC(
K
kexinzhao 已提交
433
Relu6 Activation Operator.
K
Kexin Zhao 已提交
434

F
fengjiayi 已提交
435
$out = \min(\max(0, x), 6)$
K
Kexin Zhao 已提交
436 437

)DOC");
438 439 440
  }
};

441 442
class PowOpMaker : public framework::OpProtoAndCheckerMaker {
 public:
Y
Yu Yang 已提交
443
  void Make() override {
444
    AddInput("X", "Input of Pow operator");
F
fengjiayi 已提交
445
    AddOutput("Out", "Output of Pow operator");
446
    AddAttr<float>("factor", "The exponential factor of Pow").SetDefault(1.0f);
K
Kexin Zhao 已提交
447
    AddComment(R"DOC(
K
kexinzhao 已提交
448
Pow Activation Operator.
K
Kexin Zhao 已提交
449

F
fengjiayi 已提交
450
$out = x^{factor}$
K
Kexin Zhao 已提交
451 452

)DOC");
453 454 455 456 457
  }
};

class STanhOpMaker : public framework::OpProtoAndCheckerMaker {
 public:
Y
Yu Yang 已提交
458
  void Make() override {
459
    AddInput("X", "Input of STanh operator");
F
fengjiayi 已提交
460
    AddOutput("Out", "Output of STanh operator");
461 462 463 464
    AddAttr<float>("scale_a", "The scale parameter of a for the input")
        .SetDefault(2.0f / 3.0f);
    AddAttr<float>("scale_b", "The scale parameter of b for the input")
        .SetDefault(1.7159f);
K
Kexin Zhao 已提交
465
    AddComment(R"DOC(
K
kexinzhao 已提交
466
STanh Activation Operator.
K
Kexin Zhao 已提交
467

Y
Yan Chunwei 已提交
468
$$out = b * \\frac{e^{a * x} - e^{-a * x}}{e^{a * x} + e^{-a * x}}$$
K
Kexin Zhao 已提交
469 470

)DOC");
Q
qijun 已提交
471 472 473
  }
};

474 475
class ThresholdedReluOpMaker : public framework::OpProtoAndCheckerMaker {
 public:
Y
Yu Yang 已提交
476
  void Make() override {
477
    AddInput("X", "Input of ThresholdedRelu operator");
F
fengjiayi 已提交
478
    AddOutput("Out", "Output of ThresholdedRelu operator");
Y
yuyang18 已提交
479 480
    AddAttr<float>("threshold",
                   "The threshold location of activation. [default 1.0].")
481
        .SetDefault(1.0f);
K
Kexin Zhao 已提交
482
    AddComment(R"DOC(
Y
yuyang18 已提交
483
:strong:`ThresholdedRelu activation operator`
K
Kexin Zhao 已提交
484

Y
yuyang18 已提交
485
..  math::
K
Kexin Zhao 已提交
486

Y
yuyang18 已提交
487
    out = \begin{cases}
Y
yuyang18 已提交
488
             x,  \text{if } x > threshold \\
Y
yuyang18 已提交
489 490
             0,  \text{otherwise}
          \end{cases}
K
Kexin Zhao 已提交
491
)DOC");
492 493 494
  }
};

495 496
class HardSigmoidOpMaker : public framework::OpProtoAndCheckerMaker {
 public:
Y
Yu Yang 已提交
497
  void Make() override {
498
    AddInput("X", "Input of HardSigmoid operator");
F
fengjiayi 已提交
499
    AddOutput("Out", "Output of HardSigmoid operator");
500 501 502 503
    AddAttr<float>("slope", "Slope for linear approximation of sigmoid")
        .SetDefault(0.2f);
    AddAttr<float>("offset", "Offset for linear approximation of sigmoid")
        .SetDefault(0.5f);
504
    AddComment(R"DOC(
K
kexinzhao 已提交
505
HardSigmoid Activation Operator.
506

507
Segment-wise linear approximation of sigmoid(https://arxiv.org/abs/1603.00391),
K
Kexin Zhao 已提交
508
which is much faster than sigmoid.
509

F
fengjiayi 已提交
510
$out = \max(0, \min(1, slope * x + shift))$
511 512

The slope should be positive. The offset can be either positive or negative.
K
Kexin Zhao 已提交
513
The default slope and shift are set according to the above reference.
514 515
It is recommended to use the defaults for this activation.

K
Kexin Zhao 已提交
516
)DOC");
517 518 519
  }
};

A
Abhinav Arora 已提交
520 521
class SwishOpMaker : public framework::OpProtoAndCheckerMaker {
 public:
Y
Yu Yang 已提交
522
  void Make() override {
A
Abhinav Arora 已提交
523
    AddInput("X", "Input of Swish operator");
F
fengjiayi 已提交
524
    AddOutput("Out", "Output of Swish operator");
A
Abhinav Arora 已提交
525 526 527 528
    AddAttr<float>("beta", "Constant beta of swish operator").SetDefault(1.0f);
    AddComment(R"DOC(
Swish Activation Operator.

F
fengjiayi 已提交
529
$$out = \\frac{x}{1 + e^{- \beta x}}$$
A
Abhinav Arora 已提交
530 531 532 533 534

)DOC");
  }
};

D
dzhwinter 已提交
535 536 537 538
REGISTER_ACTIVATION_OP_MAKER(Sigmoid, SigmoidDoc);
REGISTER_ACTIVATION_OP_MAKER(LogSigmoid, LogSigmoidDoc);
REGISTER_ACTIVATION_OP_MAKER(Exp, ExpDoc);
REGISTER_ACTIVATION_OP_MAKER(Relu, ReluDoc);
C
Clementine 已提交
539
REGISTER_ACTIVATION_OP_MAKER(Gelu, GeluDoc);
D
dzhwinter 已提交
540 541 542 543 544 545 546 547 548 549 550 551 552 553 554
REGISTER_ACTIVATION_OP_MAKER(Tanh, TanhDoc);
REGISTER_ACTIVATION_OP_MAKER(TanhShrink, TanhShrinkDoc);
REGISTER_ACTIVATION_OP_MAKER(Sqrt, SqrtDoc);
REGISTER_ACTIVATION_OP_MAKER(Abs, AbsDoc);
REGISTER_ACTIVATION_OP_MAKER(Ceil, CeilDoc);
REGISTER_ACTIVATION_OP_MAKER(Floor, FloorDoc);
REGISTER_ACTIVATION_OP_MAKER(Cos, CosDoc);
REGISTER_ACTIVATION_OP_MAKER(Sin, SinDoc);
REGISTER_ACTIVATION_OP_MAKER(Round, RoundDoc);
REGISTER_ACTIVATION_OP_MAKER(Reciprocal, ReciprocalDoc);
REGISTER_ACTIVATION_OP_MAKER(Log, LogDoc);
REGISTER_ACTIVATION_OP_MAKER(Square, SquareDoc);
REGISTER_ACTIVATION_OP_MAKER(Softplus, SoftplusDoc);
REGISTER_ACTIVATION_OP_MAKER(Softsign, SoftsignDoc);

D
dzhwinter 已提交
555 556
REGISTER_ACTIVATION_OP_GRAD_MAKER(Sigmoid, sigmoid);
REGISTER_ACTIVATION_OP_GRAD_MAKER(Relu, relu);
C
Clementine 已提交
557
REGISTER_ACTIVATION_OP_GRAD_MAKER(Gelu, gelu);
D
dzhwinter 已提交
558
REGISTER_ACTIVATION_OP_GRAD_MAKER(Exp, exp);
D
dzhwinter 已提交
559 560 561
REGISTER_ACTIVATION_OP_GRAD_MAKER(Tanh, tanh);
REGISTER_ACTIVATION_OP_GRAD_MAKER(Ceil, ceil);
REGISTER_ACTIVATION_OP_GRAD_MAKER(Floor, floor);
D
dzhwinter 已提交
562
REGISTER_ACTIVATION_OP_GRAD_MAKER(Sqrt, sqrt);
D
dzhwinter 已提交
563
REGISTER_ACTIVATION_OP_GRAD_MAKER(SoftRelu, soft_relu);
D
dzhwinter 已提交
564 565
REGISTER_ACTIVATION_OP_GRAD_MAKER(Relu6, relu6);
REGISTER_ACTIVATION_OP_GRAD_MAKER(Reciprocal, reciprocal);
D
dzhwinter 已提交
566
REGISTER_ACTIVATION_OP_GRAD_MAKER(HardSigmoid, hard_sigmoid);
Q
qijun 已提交
567 568 569 570
}  // namespace operators
}  // namespace paddle

namespace ops = paddle::operators;
571

D
dzhwinter 已提交
572
#define FOR_EACH_INPLACE_OP_FUNCTOR(__macro) \
D
dzhwinter 已提交
573
  __macro(Sigmoid, sigmoid);                 \
574
  __macro(Relu, relu);                       \
D
dzhwinter 已提交
575
  __macro(Exp, exp);                         \
576
  __macro(Tanh, tanh);                       \
D
dzhwinter 已提交
577 578
  __macro(Ceil, ceil);                       \
  __macro(Floor, floor);                     \
579
  __macro(Sqrt, sqrt);                       \
D
dzhwinter 已提交
580 581 582 583
  __macro(SoftRelu, soft_relu);              \
  __macro(Relu6, relu6);                     \
  __macro(Reciprocal, reciprocal);           \
  __macro(HardSigmoid, hard_sigmoid);
D
dzhwinter 已提交
584 585

#define FOR_EACH_OP_FUNCTOR(__macro) \
D
dzhwinter 已提交
586 587
  __macro(LogSigmoid, logsigmoid);   \
  __macro(SoftShrink, softshrink);   \
588
  __macro(Abs, abs);                 \
D
dzhwinter 已提交
589
  __macro(Cos, cos);                 \
590
  __macro(Acos, acos);               \
D
dzhwinter 已提交
591
  __macro(Sin, sin);                 \
592 593
  __macro(Asin, asin);               \
  __macro(Atan, atan);               \
D
dzhwinter 已提交
594 595 596
  __macro(Round, round);             \
  __macro(Log, log);                 \
  __macro(Square, square);           \
C
Clementine 已提交
597
  __macro(Gelu, gelu);               \
D
dzhwinter 已提交
598 599 600 601 602 603 604 605 606 607 608 609
  __macro(BRelu, brelu);             \
  __macro(Pow, pow);                 \
  __macro(STanh, stanh);             \
  __macro(Softplus, softplus);       \
  __macro(Softsign, softsign);       \
  __macro(LeakyRelu, leaky_relu);    \
  __macro(TanhShrink, tanh_shrink);  \
  __macro(ELU, elu);                 \
  __macro(HardShrink, hard_shrink);  \
  __macro(Swish, swish);             \
  __macro(ThresholdedRelu, thresholded_relu);

D
dzhwinter 已提交
610 611 612 613 614 615 616 617
#define REGISTER_INPLACE_ACTIVATION_OP(OP_NAME, KERNEL_TYPE)                   \
  REGISTER_OPERATOR(KERNEL_TYPE, ::paddle::operators::ActivationOp,            \
                    ::paddle::operators::OP_NAME##OpMaker,                     \
                    ::paddle::operators::ActivationOpInferVarType,             \
                    ::paddle::operators::OP_NAME##GradMaker,                   \
                    ::paddle::framework::SingleOpInplaceInToOut);              \
  REGISTER_OPERATOR(KERNEL_TYPE##_grad, ::paddle::operators::ActivationOpGrad, \
                    ::paddle::framework::SingleOpInplaceInToOut)
D
dzhwinter 已提交
618

D
dzhwinter 已提交
619 620 621
#define REGISTER_ACTIVATION_OP(OP_NAME, KERNEL_TYPE)                    \
  REGISTER_OPERATOR(KERNEL_TYPE, ::paddle::operators::ActivationOp,     \
                    ::paddle::operators::OP_NAME##OpMaker,              \
622
                    ::paddle::operators::ActivationOpInferVarType,      \
D
dzhwinter 已提交
623 624
                    ::paddle::framework::DefaultGradOpDescMaker<true>); \
  REGISTER_OPERATOR(KERNEL_TYPE##_grad, ::paddle::operators::ActivationOpGrad)
A
Abhinav Arora 已提交
625

Q
QI JUN 已提交
626 627 628 629 630 631 632 633 634 635 636
#define REGISTER_ACTIVATION_CPU_KERNEL(act_type, functor, grad_functor)   \
  REGISTER_OP_CPU_KERNEL(                                                 \
      act_type, ops::ActivationKernel<paddle::platform::CPUDeviceContext, \
                                      ops::functor<float>>,               \
      ops::ActivationKernel<paddle::platform::CPUDeviceContext,           \
                            ops::functor<double>>);                       \
  REGISTER_OP_CPU_KERNEL(                                                 \
      act_type##_grad,                                                    \
      ops::ActivationGradKernel<paddle::platform::CPUDeviceContext,       \
                                ops::grad_functor<float>>,                \
      ops::ActivationGradKernel<paddle::platform::CPUDeviceContext,       \
Y
Yu Yang 已提交
637
                                ops::grad_functor<double>>);
638

D
dzhwinter 已提交
639
FOR_EACH_OP_FUNCTOR(REGISTER_ACTIVATION_OP);
D
dzhwinter 已提交
640
FOR_EACH_INPLACE_OP_FUNCTOR(REGISTER_INPLACE_ACTIVATION_OP);
641
FOR_EACH_KERNEL_FUNCTOR(REGISTER_ACTIVATION_CPU_KERNEL);