activation_op.cc 19.6 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"
D
dzhwinter 已提交
16
#include <string>
17
#include "paddle/fluid/operators/mkldnn/mkldnn_activation_op.h"
D
dzhwinter 已提交
18
#include "paddle/fluid/platform/port.h"
19 20 21
#ifdef PADDLE_WITH_CUDA
#include "paddle/fluid/platform/cudnn_helper.h"
#endif
Q
qijun 已提交
22 23 24 25

namespace paddle {
namespace operators {

26 27
using paddle::framework::Tensor;

28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
#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 已提交
49
  }
D
dzhwinter 已提交
50 51 52 53 54 55 56 57 58

#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 {    \
59
      auto* op = new ::paddle::framework::OpDesc();                          \
D
dzhwinter 已提交
60 61 62 63 64 65 66 67 68 69
      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 已提交
70
  }
D
dzhwinter 已提交
71

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

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

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

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

C
chengduo 已提交
112 113 114 115 116 117
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"}};
118 119 120
  }
};

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

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

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

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

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

D
dzhwinter 已提交
142
)DOC";
Q
qijun 已提交
143

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

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

D
dzhwinter 已提交
149
)DOC";
150

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

F
fengjiayi 已提交
154
$out = e^x$
K
Kexin Zhao 已提交
155

D
dzhwinter 已提交
156
)DOC";
Q
qijun 已提交
157

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

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

D
dzhwinter 已提交
163
)DOC";
K
Kexin Zhao 已提交
164

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

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

)DOC";

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

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

D
dzhwinter 已提交
177
)DOC";
178

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

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

D
dzhwinter 已提交
184
)DOC";
K
Kexin Zhao 已提交
185

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

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

D
dzhwinter 已提交
191
)DOC";
192

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

F
fengjiayi 已提交
196
$out = |x|$
K
Kexin Zhao 已提交
197

D
dzhwinter 已提交
198
)DOC";
199

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

203
$out = \left \lceil x \right \rceil$
D
dzhwinter 已提交
204

D
dzhwinter 已提交
205
)DOC";
D
dzhwinter 已提交
206

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

210
$out = \left \lfloor x \right \rfloor$
D
dzhwinter 已提交
211

D
dzhwinter 已提交
212
)DOC";
D
dzhwinter 已提交
213

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

$out = cos(x)$

D
dzhwinter 已提交
219
)DOC";
C
add cos  
chengduoZH 已提交
220

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

$out = sin(x)$

D
dzhwinter 已提交
226
)DOC";
C
add sin  
chengduoZH 已提交
227

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

F
fengjiayi 已提交
231
$out = [x]$
D
dzhwinter 已提交
232

D
dzhwinter 已提交
233
)DOC";
D
dzhwinter 已提交
234

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

238
$$out = \\frac{1}{x}$$
K
Kexin Zhao 已提交
239

D
dzhwinter 已提交
240
)DOC";
241

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

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

Natural logarithm of x.

D
dzhwinter 已提交
249 250
)DOC";

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

$out = x^2$
255

D
dzhwinter 已提交
256 257
)DOC";

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

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

)DOC";

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

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

)DOC";

272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292
UNUSED constexpr char AcosDoc[] = R"DOC(
Arccosine Activation Operator.

$${out}_{i} = \cos^{-1}({input}_{i})$$

)DOC";

UNUSED constexpr char AsinDoc[] = R"DOC(
Arcsine Activation Operator.

$out = \sin^{-1}({input}_{i})$

)DOC";

UNUSED constexpr char AtanDoc[] = R"DOC(
Arctanh Activation Operator.

$out = \tanh^{-1}({input}_{i})$

)DOC";

D
dzhwinter 已提交
293
class LeakyReluOpMaker : public framework::OpProtoAndCheckerMaker {
294
 public:
Y
Yu Yang 已提交
295
  void Make() override {
D
dzhwinter 已提交
296 297 298
    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 已提交
299
    AddComment(R"DOC(
D
dzhwinter 已提交
300
LeakyRelu Activation Operator.
K
Kexin Zhao 已提交
301

D
dzhwinter 已提交
302
$out = \max(x, \alpha * x)$
K
Kexin Zhao 已提交
303 304

)DOC");
305 306 307
  }
};

D
dzhwinter 已提交
308
class SoftShrinkOpMaker : public framework::OpProtoAndCheckerMaker {
K
kexinzhao 已提交
309
 public:
Y
Yu Yang 已提交
310
  void Make() override {
D
dzhwinter 已提交
311 312 313
    AddInput("X", "Input of Softshrink operator");
    AddOutput("Out", "Output of Softshrink operator");
    AddAttr<float>("lambda", "non-negative offset").SetDefault(0.5f);
K
Kexin Zhao 已提交
314
    AddComment(R"DOC(
315 316 317
:strong:`Softshrink Activation Operator`

..  math::
318
    out = \begin{cases}
319 320 321 322
         x - \lambda, \text{if } x > \lambda \\
         x + \lambda, \text{if } x < -\lambda \\
         0,  \text{otherwise}
         \end{cases}
K
Kexin Zhao 已提交
323 324

)DOC");
K
kexinzhao 已提交
325 326 327
  }
};

D
dzhwinter 已提交
328
class HardShrinkOpMaker : public framework::OpProtoAndCheckerMaker {
329
 public:
Y
Yu Yang 已提交
330
  void Make() override {
D
dzhwinter 已提交
331 332
    AddInput("X", "Input of HardShrink operator");
    AddOutput("Out", "Output of HardShrink operator");
Y
yuyang18 已提交
333 334
    AddAttr<float>("threshold",
                   "The value of threshold for HardShrink. [default: 0.5]")
D
dzhwinter 已提交
335
        .SetDefault(0.5f);
K
Kexin Zhao 已提交
336
    AddComment(R"DOC(
Y
yuyang18 已提交
337
:strong:`HardShrink activation operator`
K
Kexin Zhao 已提交
338

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

)DOC");
347 348 349
  }
};

350 351
class BReluOpMaker : public framework::OpProtoAndCheckerMaker {
 public:
Y
Yu Yang 已提交
352
  void Make() override {
353
    AddInput("X", "Input of BRelu operator");
F
fengjiayi 已提交
354
    AddOutput("Out", "Output of BRelu operator");
355 356 357 358
    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 已提交
359
    AddComment(R"DOC(
K
kexinzhao 已提交
360
BRelu Activation Operator.
K
Kexin Zhao 已提交
361

F
fengjiayi 已提交
362
$out = \max(\min(x, t_{min}), t_{max})$
K
Kexin Zhao 已提交
363 364

)DOC");
365 366 367 368 369
  }
};

class SoftReluOpMaker : public framework::OpProtoAndCheckerMaker {
 public:
Y
Yu Yang 已提交
370
  void Make() override {
371
    AddInput("X", "Input of SoftRelu operator");
F
fengjiayi 已提交
372
    AddOutput("Out", "Output of SoftRelu operator");
373 374
    AddAttr<float>("threshold", "The threshold value of SoftRelu")
        .SetDefault(40.0f);
K
Kexin Zhao 已提交
375
    AddComment(R"DOC(
K
kexinzhao 已提交
376
SoftRelu Activation Operator.
K
Kexin Zhao 已提交
377

F
fengjiayi 已提交
378
$out = \ln(1 + \exp(\max(\min(x, threshold), threshold))$
K
Kexin Zhao 已提交
379 380

)DOC");
381 382 383
  }
};

384 385
class ELUOpMaker : public framework::OpProtoAndCheckerMaker {
 public:
Y
Yu Yang 已提交
386
  void Make() override {
K
Kexin Zhao 已提交
387
    AddInput("X", "Input of ELU operator");
F
fengjiayi 已提交
388
    AddOutput("Out", "Output of ELU operator");
389
    AddAttr<float>("alpha", "The alpha value of ELU").SetDefault(1.0f);
390
    AddComment(R"DOC(
K
kexinzhao 已提交
391
ELU Activation Operator.
K
Kexin Zhao 已提交
392 393 394 395

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

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

)DOC");
399 400 401
  }
};

402 403
class Relu6OpMaker : public framework::OpProtoAndCheckerMaker {
 public:
Y
Yu Yang 已提交
404
  void Make() override {
405
    AddInput("X", "Input of Relu6 operator");
F
fengjiayi 已提交
406
    AddOutput("Out", "Output of Relu6 operator");
407 408
    AddAttr<float>("threshold", "The threshold value of Relu6")
        .SetDefault(6.0f);
K
Kexin Zhao 已提交
409
    AddComment(R"DOC(
K
kexinzhao 已提交
410
Relu6 Activation Operator.
K
Kexin Zhao 已提交
411

F
fengjiayi 已提交
412
$out = \min(\max(0, x), 6)$
K
Kexin Zhao 已提交
413 414

)DOC");
415 416 417
  }
};

418 419
class PowOpMaker : public framework::OpProtoAndCheckerMaker {
 public:
Y
Yu Yang 已提交
420
  void Make() override {
421
    AddInput("X", "Input of Pow operator");
F
fengjiayi 已提交
422
    AddOutput("Out", "Output of Pow operator");
423
    AddAttr<float>("factor", "The exponential factor of Pow").SetDefault(1.0f);
K
Kexin Zhao 已提交
424
    AddComment(R"DOC(
K
kexinzhao 已提交
425
Pow Activation Operator.
K
Kexin Zhao 已提交
426

F
fengjiayi 已提交
427
$out = x^{factor}$
K
Kexin Zhao 已提交
428 429

)DOC");
430 431 432 433 434
  }
};

class STanhOpMaker : public framework::OpProtoAndCheckerMaker {
 public:
Y
Yu Yang 已提交
435
  void Make() override {
436
    AddInput("X", "Input of STanh operator");
F
fengjiayi 已提交
437
    AddOutput("Out", "Output of STanh operator");
438 439 440 441
    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 已提交
442
    AddComment(R"DOC(
K
kexinzhao 已提交
443
STanh Activation Operator.
K
Kexin Zhao 已提交
444

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

)DOC");
Q
qijun 已提交
448 449 450
  }
};

451 452
class ThresholdedReluOpMaker : public framework::OpProtoAndCheckerMaker {
 public:
Y
Yu Yang 已提交
453
  void Make() override {
454
    AddInput("X", "Input of ThresholdedRelu operator");
F
fengjiayi 已提交
455
    AddOutput("Out", "Output of ThresholdedRelu operator");
Y
yuyang18 已提交
456 457
    AddAttr<float>("threshold",
                   "The threshold location of activation. [default 1.0].")
458
        .SetDefault(1.0f);
K
Kexin Zhao 已提交
459
    AddComment(R"DOC(
Y
yuyang18 已提交
460
:strong:`ThresholdedRelu activation operator`
K
Kexin Zhao 已提交
461

Y
yuyang18 已提交
462
..  math::
K
Kexin Zhao 已提交
463

Y
yuyang18 已提交
464
    out = \begin{cases}
Y
yuyang18 已提交
465
             x,  \text{if } x > threshold \\
Y
yuyang18 已提交
466 467
             0,  \text{otherwise}
          \end{cases}
K
Kexin Zhao 已提交
468
)DOC");
469 470 471
  }
};

472 473
class HardSigmoidOpMaker : public framework::OpProtoAndCheckerMaker {
 public:
Y
Yu Yang 已提交
474
  void Make() override {
475
    AddInput("X", "Input of HardSigmoid operator");
F
fengjiayi 已提交
476
    AddOutput("Out", "Output of HardSigmoid operator");
477 478 479 480
    AddAttr<float>("slope", "Slope for linear approximation of sigmoid")
        .SetDefault(0.2f);
    AddAttr<float>("offset", "Offset for linear approximation of sigmoid")
        .SetDefault(0.5f);
481
    AddComment(R"DOC(
K
kexinzhao 已提交
482
HardSigmoid Activation Operator.
483

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

F
fengjiayi 已提交
487
$out = \max(0, \min(1, slope * x + shift))$
488 489

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

K
Kexin Zhao 已提交
493
)DOC");
494 495 496
  }
};

A
Abhinav Arora 已提交
497 498
class SwishOpMaker : public framework::OpProtoAndCheckerMaker {
 public:
Y
Yu Yang 已提交
499
  void Make() override {
A
Abhinav Arora 已提交
500
    AddInput("X", "Input of Swish operator");
F
fengjiayi 已提交
501
    AddOutput("Out", "Output of Swish operator");
A
Abhinav Arora 已提交
502 503 504 505
    AddAttr<float>("beta", "Constant beta of swish operator").SetDefault(1.0f);
    AddComment(R"DOC(
Swish Activation Operator.

F
fengjiayi 已提交
506
$$out = \\frac{x}{1 + e^{- \beta x}}$$
A
Abhinav Arora 已提交
507 508 509 510 511

)DOC");
  }
};

D
dzhwinter 已提交
512 513 514 515
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 已提交
516
REGISTER_ACTIVATION_OP_MAKER(Gelu, GeluDoc);
D
dzhwinter 已提交
517
REGISTER_ACTIVATION_OP_MAKER(Tanh, TanhDoc);
518
REGISTER_ACTIVATION_OP_MAKER(Atan, AtanDoc);
D
dzhwinter 已提交
519 520 521 522 523 524
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);
525
REGISTER_ACTIVATION_OP_MAKER(Acos, AcosDoc);
D
dzhwinter 已提交
526
REGISTER_ACTIVATION_OP_MAKER(Sin, SinDoc);
527
REGISTER_ACTIVATION_OP_MAKER(Asin, AsinDoc);
D
dzhwinter 已提交
528 529 530 531 532 533 534
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 已提交
535 536
REGISTER_ACTIVATION_OP_GRAD_MAKER(Sigmoid, sigmoid);
REGISTER_ACTIVATION_OP_GRAD_MAKER(Relu, relu);
C
Clementine 已提交
537
REGISTER_ACTIVATION_OP_GRAD_MAKER(Gelu, gelu);
D
dzhwinter 已提交
538
REGISTER_ACTIVATION_OP_GRAD_MAKER(Exp, exp);
D
dzhwinter 已提交
539 540 541
REGISTER_ACTIVATION_OP_GRAD_MAKER(Tanh, tanh);
REGISTER_ACTIVATION_OP_GRAD_MAKER(Ceil, ceil);
REGISTER_ACTIVATION_OP_GRAD_MAKER(Floor, floor);
D
dzhwinter 已提交
542
REGISTER_ACTIVATION_OP_GRAD_MAKER(Sqrt, sqrt);
D
dzhwinter 已提交
543
REGISTER_ACTIVATION_OP_GRAD_MAKER(SoftRelu, soft_relu);
D
dzhwinter 已提交
544 545
REGISTER_ACTIVATION_OP_GRAD_MAKER(Relu6, relu6);
REGISTER_ACTIVATION_OP_GRAD_MAKER(Reciprocal, reciprocal);
D
dzhwinter 已提交
546
REGISTER_ACTIVATION_OP_GRAD_MAKER(HardSigmoid, hard_sigmoid);
Q
qijun 已提交
547 548 549 550
}  // namespace operators
}  // namespace paddle

namespace ops = paddle::operators;
551

D
dzhwinter 已提交
552
#define FOR_EACH_INPLACE_OP_FUNCTOR(__macro) \
D
dzhwinter 已提交
553
  __macro(Sigmoid, sigmoid);                 \
554
  __macro(Relu, relu);                       \
D
dzhwinter 已提交
555
  __macro(Exp, exp);                         \
556
  __macro(Tanh, tanh);                       \
D
dzhwinter 已提交
557 558
  __macro(Ceil, ceil);                       \
  __macro(Floor, floor);                     \
559
  __macro(Sqrt, sqrt);                       \
D
dzhwinter 已提交
560 561 562 563
  __macro(SoftRelu, soft_relu);              \
  __macro(Relu6, relu6);                     \
  __macro(Reciprocal, reciprocal);           \
  __macro(HardSigmoid, hard_sigmoid);
D
dzhwinter 已提交
564 565

#define FOR_EACH_OP_FUNCTOR(__macro) \
D
dzhwinter 已提交
566 567
  __macro(LogSigmoid, logsigmoid);   \
  __macro(SoftShrink, softshrink);   \
568
  __macro(Abs, abs);                 \
D
dzhwinter 已提交
569
  __macro(Cos, cos);                 \
570
  __macro(Acos, acos);               \
D
dzhwinter 已提交
571
  __macro(Sin, sin);                 \
572 573
  __macro(Asin, asin);               \
  __macro(Atan, atan);               \
D
dzhwinter 已提交
574 575 576
  __macro(Round, round);             \
  __macro(Log, log);                 \
  __macro(Square, square);           \
C
Clementine 已提交
577
  __macro(Gelu, gelu);               \
D
dzhwinter 已提交
578 579 580 581 582 583 584 585 586 587 588 589
  __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 已提交
590 591 592 593 594 595 596 597
#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 已提交
598

D
dzhwinter 已提交
599 600 601
#define REGISTER_ACTIVATION_OP(OP_NAME, KERNEL_TYPE)                    \
  REGISTER_OPERATOR(KERNEL_TYPE, ::paddle::operators::ActivationOp,     \
                    ::paddle::operators::OP_NAME##OpMaker,              \
602
                    ::paddle::operators::ActivationOpInferVarType,      \
D
dzhwinter 已提交
603 604
                    ::paddle::framework::DefaultGradOpDescMaker<true>); \
  REGISTER_OPERATOR(KERNEL_TYPE##_grad, ::paddle::operators::ActivationOpGrad)
A
Abhinav Arora 已提交
605

Q
QI JUN 已提交
606 607 608 609 610 611 612 613 614 615 616
#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 已提交
617
                                ops::grad_functor<double>>);
618

D
dzhwinter 已提交
619
FOR_EACH_OP_FUNCTOR(REGISTER_ACTIVATION_OP);
D
dzhwinter 已提交
620
FOR_EACH_INPLACE_OP_FUNCTOR(REGISTER_INPLACE_ACTIVATION_OP);
621
FOR_EACH_KERNEL_FUNCTOR(REGISTER_ACTIVATION_CPU_KERNEL);