activation_op.cc 20.2 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

191 192 193
Please make sure legal input, when input a negative value closed to zero,
you should add a small epsilon(1e-12) to avoid negative number caused by numerical errors.

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

D
dzhwinter 已提交
196
)DOC";
197

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

F
fengjiayi 已提交
201
$out = |x|$
K
Kexin Zhao 已提交
202

D
dzhwinter 已提交
203
)DOC";
204

D
dzhwinter 已提交
205
UNUSED constexpr char CeilDoc[] = R"DOC(
D
dzhwinter 已提交
206 207
Ceil Activation Operator.

208
$out = \left \lceil x \right \rceil$
D
dzhwinter 已提交
209

D
dzhwinter 已提交
210
)DOC";
D
dzhwinter 已提交
211

D
dzhwinter 已提交
212
UNUSED constexpr char FloorDoc[] = R"DOC(
D
dzhwinter 已提交
213 214
Floor Activation Operator.

215
$out = \left \lfloor x \right \rfloor$
D
dzhwinter 已提交
216

D
dzhwinter 已提交
217
)DOC";
D
dzhwinter 已提交
218

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

$out = cos(x)$

D
dzhwinter 已提交
224
)DOC";
C
add cos  
chengduoZH 已提交
225

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

$out = sin(x)$

D
dzhwinter 已提交
231
)DOC";
C
add sin  
chengduoZH 已提交
232

D
dzhwinter 已提交
233
UNUSED constexpr char RoundDoc[] = R"DOC(
D
dzhwinter 已提交
234 235
Round Activation Operator.

F
fengjiayi 已提交
236
$out = [x]$
D
dzhwinter 已提交
237

D
dzhwinter 已提交
238
)DOC";
D
dzhwinter 已提交
239

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

243
$$out = \\frac{1}{x}$$
K
Kexin Zhao 已提交
244

D
dzhwinter 已提交
245
)DOC";
246

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

F
fengjiayi 已提交
250
$out = \ln(x)$
K
Kexin Zhao 已提交
251 252 253

Natural logarithm of x.

D
dzhwinter 已提交
254 255
)DOC";

D
dzhwinter 已提交
256
UNUSED constexpr char SquareDoc[] = R"DOC(
D
dzhwinter 已提交
257 258 259
Square Activation Operator.

$out = x^2$
260

D
dzhwinter 已提交
261 262
)DOC";

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

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

)DOC";

D
dzhwinter 已提交
270
UNUSED constexpr char SoftsignDoc[] = R"DOC(
D
dzhwinter 已提交
271 272
Softsign Activation Operator.

273
$$out = \\frac{x}{1 + \|x\|}$$
D
dzhwinter 已提交
274 275 276

)DOC";

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

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

T
tink2123 已提交
287 288 289
)DOC");
  }
};
290

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

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

T
tink2123 已提交
301 302 303
)DOC");
  }
};
304

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

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

T
tink2123 已提交
315 316 317
)DOC");
  }
};
318

D
dzhwinter 已提交
319
class LeakyReluOpMaker : public framework::OpProtoAndCheckerMaker {
320
 public:
Y
Yu Yang 已提交
321
  void Make() override {
D
dzhwinter 已提交
322 323 324
    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 已提交
325
    AddComment(R"DOC(
D
dzhwinter 已提交
326
LeakyRelu Activation Operator.
K
Kexin Zhao 已提交
327

D
dzhwinter 已提交
328
$out = \max(x, \alpha * x)$
K
Kexin Zhao 已提交
329 330

)DOC");
331 332 333
  }
};

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

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

)DOC");
K
kexinzhao 已提交
351 352 353
  }
};

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

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

)DOC");
373 374 375
  }
};

376 377
class BReluOpMaker : public framework::OpProtoAndCheckerMaker {
 public:
Y
Yu Yang 已提交
378
  void Make() override {
379
    AddInput("X", "Input of BRelu operator");
F
fengjiayi 已提交
380
    AddOutput("Out", "Output of BRelu operator");
381 382 383 384
    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 已提交
385
    AddComment(R"DOC(
K
kexinzhao 已提交
386
BRelu Activation Operator.
K
Kexin Zhao 已提交
387

F
fengjiayi 已提交
388
$out = \max(\min(x, t_{min}), t_{max})$
K
Kexin Zhao 已提交
389 390

)DOC");
391 392 393 394 395
  }
};

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

F
fengjiayi 已提交
404
$out = \ln(1 + \exp(\max(\min(x, threshold), threshold))$
K
Kexin Zhao 已提交
405 406

)DOC");
407 408 409
  }
};

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

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

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

)DOC");
425 426 427
  }
};

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

F
fengjiayi 已提交
438
$out = \min(\max(0, x), 6)$
K
Kexin Zhao 已提交
439 440

)DOC");
441 442 443
  }
};

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

F
fengjiayi 已提交
453
$out = x^{factor}$
K
Kexin Zhao 已提交
454 455

)DOC");
456 457 458 459 460
  }
};

class STanhOpMaker : public framework::OpProtoAndCheckerMaker {
 public:
Y
Yu Yang 已提交
461
  void Make() override {
462
    AddInput("X", "Input of STanh operator");
F
fengjiayi 已提交
463
    AddOutput("Out", "Output of STanh operator");
464 465 466 467
    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 已提交
468
    AddComment(R"DOC(
K
kexinzhao 已提交
469
STanh Activation Operator.
K
Kexin Zhao 已提交
470

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

)DOC");
Q
qijun 已提交
474 475 476
  }
};

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

Y
yuyang18 已提交
488
..  math::
K
Kexin Zhao 已提交
489

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

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

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

F
fengjiayi 已提交
513
$out = \max(0, \min(1, slope * x + shift))$
514 515

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

K
Kexin Zhao 已提交
519
)DOC");
520 521 522
  }
};

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

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

)DOC");
  }
};

D
dzhwinter 已提交
538 539 540 541
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 已提交
542
REGISTER_ACTIVATION_OP_MAKER(Gelu, GeluDoc);
D
dzhwinter 已提交
543 544 545 546 547 548 549 550 551 552 553 554 555 556 557
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 已提交
558 559
REGISTER_ACTIVATION_OP_GRAD_MAKER(Sigmoid, sigmoid);
REGISTER_ACTIVATION_OP_GRAD_MAKER(Relu, relu);
C
Clementine 已提交
560
REGISTER_ACTIVATION_OP_GRAD_MAKER(Gelu, gelu);
D
dzhwinter 已提交
561
REGISTER_ACTIVATION_OP_GRAD_MAKER(Exp, exp);
D
dzhwinter 已提交
562 563 564
REGISTER_ACTIVATION_OP_GRAD_MAKER(Tanh, tanh);
REGISTER_ACTIVATION_OP_GRAD_MAKER(Ceil, ceil);
REGISTER_ACTIVATION_OP_GRAD_MAKER(Floor, floor);
D
dzhwinter 已提交
565
REGISTER_ACTIVATION_OP_GRAD_MAKER(Sqrt, sqrt);
D
dzhwinter 已提交
566
REGISTER_ACTIVATION_OP_GRAD_MAKER(SoftRelu, soft_relu);
D
dzhwinter 已提交
567 568
REGISTER_ACTIVATION_OP_GRAD_MAKER(Relu6, relu6);
REGISTER_ACTIVATION_OP_GRAD_MAKER(Reciprocal, reciprocal);
D
dzhwinter 已提交
569
REGISTER_ACTIVATION_OP_GRAD_MAKER(HardSigmoid, hard_sigmoid);
Q
qijun 已提交
570 571 572 573
}  // namespace operators
}  // namespace paddle

namespace ops = paddle::operators;
574

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

#define FOR_EACH_OP_FUNCTOR(__macro) \
D
dzhwinter 已提交
589 590
  __macro(LogSigmoid, logsigmoid);   \
  __macro(SoftShrink, softshrink);   \
591
  __macro(Abs, abs);                 \
D
dzhwinter 已提交
592
  __macro(Cos, cos);                 \
593
  __macro(Acos, acos);               \
D
dzhwinter 已提交
594
  __macro(Sin, sin);                 \
595 596
  __macro(Asin, asin);               \
  __macro(Atan, atan);               \
D
dzhwinter 已提交
597 598 599
  __macro(Round, round);             \
  __macro(Log, log);                 \
  __macro(Square, square);           \
C
Clementine 已提交
600
  __macro(Gelu, gelu);               \
D
dzhwinter 已提交
601 602 603 604 605 606 607 608 609 610 611 612
  __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 已提交
613 614 615 616 617 618 619 620
#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 已提交
621

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

Q
QI JUN 已提交
629 630 631 632 633 634 635 636 637 638 639
#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 已提交
640
                                ops::grad_functor<double>>);
641

D
dzhwinter 已提交
642
FOR_EACH_OP_FUNCTOR(REGISTER_ACTIVATION_OP);
D
dzhwinter 已提交
643
FOR_EACH_INPLACE_OP_FUNCTOR(REGISTER_INPLACE_ACTIVATION_OP);
644
FOR_EACH_KERNEL_FUNCTOR(REGISTER_ACTIVATION_CPU_KERNEL);