提交 9583c545 编写于 作者: C chenjiaoAngel

fix elu act not find error, test=develop

上级 b1612134
...@@ -771,7 +771,7 @@ void act_elu<float>( ...@@ -771,7 +771,7 @@ void act_elu<float>(
int thread_remain = size % threads; int thread_remain = size % threads;
int neon_loop_cnt_dim16 = nums_per_thread >> 4; int neon_loop_cnt_dim16 = nums_per_thread >> 4;
int neon_loop_remain_dim16 = nums_per_thread & 15; int neon_loop_remain_dim16 = nums_per_thread & 15;
float32x4_t alpha = vdupq_n_f32(alpha); float32x4_t valpha = vdupq_n_f32(alpha);
float32x4_t vzero = vdupq_n_f32(0.f); float32x4_t vzero = vdupq_n_f32(0.f);
float32x4_t vone = vdupq_n_f32(1.f); float32x4_t vone = vdupq_n_f32(1.f);
int cnt = neon_loop_remain_dim16 >> 2; int cnt = neon_loop_remain_dim16 >> 2;
...@@ -797,6 +797,10 @@ void act_elu<float>( ...@@ -797,6 +797,10 @@ void act_elu<float>(
float32x4_t vb_sub = vsubq_f32(vb_exp, vone); float32x4_t vb_sub = vsubq_f32(vb_exp, vone);
float32x4_t vc_sub = vsubq_f32(vc_exp, vone); float32x4_t vc_sub = vsubq_f32(vc_exp, vone);
float32x4_t vd_sub = vsubq_f32(vd_exp, vone); float32x4_t vd_sub = vsubq_f32(vd_exp, vone);
va_sub = vmulq_f32(va_sub, valpha);
vb_sub = vmulq_f32(vb_sub, valpha);
vc_sub = vmulq_f32(vc_sub, valpha);
vd_sub = vmulq_f32(vd_sub, valpha);
float32x4_t va_min = vminq_f32(va_sub, vzero); float32x4_t va_min = vminq_f32(va_sub, vzero);
float32x4_t vb_min = vminq_f32(vb_sub, vzero); float32x4_t vb_min = vminq_f32(vb_sub, vzero);
float32x4_t vc_min = vminq_f32(vc_sub, vzero); float32x4_t vc_min = vminq_f32(vc_sub, vzero);
...@@ -817,6 +821,7 @@ void act_elu<float>( ...@@ -817,6 +821,7 @@ void act_elu<float>(
float32x4_t va_exp = exp_ps(va); float32x4_t va_exp = exp_ps(va);
float32x4_t va_max = vmaxq_f32(va, vzero); float32x4_t va_max = vmaxq_f32(va, vzero);
float32x4_t va_sub = vsubq_f32(va_exp, vone); float32x4_t va_sub = vsubq_f32(va_exp, vone);
va_sub = vmulq_f32(va_sub, valpha);
float32x4_t va_min = vminq_f32(va_sub, vzero); float32x4_t va_min = vminq_f32(va_sub, vzero);
float32x4_t va_rst = vaddq_f32(va_max, va_min); float32x4_t va_rst = vaddq_f32(va_max, va_min);
vst1q_f32(ptr_out_thread, va_rst); vst1q_f32(ptr_out_thread, va_rst);
...@@ -825,7 +830,7 @@ void act_elu<float>( ...@@ -825,7 +830,7 @@ void act_elu<float>(
} }
for (int j = 0; j < remain; j++) { for (int j = 0; j < remain; j++) {
float beta = alpha * (expf(ptr_in_thread[0]) - 1); float beta = alpha * (expf(ptr_in_thread[0]) - 1);
float max = ptr_in[0] >= 0.f ? ptr_in_thread[0] : 0.f; float max = ptr_in_thread[0] >= 0.f ? ptr_in_thread[0] : 0.f;
float min = beta <= 0.f ? beta : 0.f; float min = beta <= 0.f ? beta : 0.f;
ptr_out_thread[0] = min + max; ptr_out_thread[0] = min + max;
ptr_in_thread++; ptr_in_thread++;
......
...@@ -375,4 +375,4 @@ REGISTER_LITE_KERNEL(elu, ...@@ -375,4 +375,4 @@ REGISTER_LITE_KERNEL(elu,
def) def)
.BindInput("X", {LiteType::GetTensorTy(TARGET(kARM))}) .BindInput("X", {LiteType::GetTensorTy(TARGET(kARM))})
.BindOutput("Out", {LiteType::GetTensorTy(TARGET(kARM))}) .BindOutput("Out", {LiteType::GetTensorTy(TARGET(kARM))})
.Finalize(); .Finalize();
\ No newline at end of file
...@@ -87,7 +87,7 @@ bool ActivationOp::AttachImpl(const cpp::OpDesc& opdesc, lite::Scope* scope) { ...@@ -87,7 +87,7 @@ bool ActivationOp::AttachImpl(const cpp::OpDesc& opdesc, lite::Scope* scope) {
param_.relu_threshold = opdesc.GetAttr<float>("threshold"); param_.relu_threshold = opdesc.GetAttr<float>("threshold");
} else if (opdesc.Type() == "elu") { } else if (opdesc.Type() == "elu") {
param_.active_type = lite_api::ActivationType::kElu; param_.active_type = lite_api::ActivationType::kElu;
param_.param_.Elu_alpha = opdesc.GetAttr<float>("alpha"); param_.Elu_alpha = opdesc.GetAttr<float>("alpha");
} }
VLOG(4) << "opdesc.Type():" << opdesc.Type(); VLOG(4) << "opdesc.Type():" << opdesc.Type();
......
...@@ -39,7 +39,8 @@ enum activation_type_test { ...@@ -39,7 +39,8 @@ enum activation_type_test {
SQUARE, SQUARE,
HARD_SWISH, HARD_SWISH,
RECIPROCAL, RECIPROCAL,
THRESHOLDED_RELU THRESHOLDED_RELU,
ELU
}; };
class ActivationComputeTester : public arena::TestCase { class ActivationComputeTester : public arena::TestCase {
...@@ -56,6 +57,7 @@ class ActivationComputeTester : public arena::TestCase { ...@@ -56,6 +57,7 @@ class ActivationComputeTester : public arena::TestCase {
float hard_swish_scale = 6.0; float hard_swish_scale = 6.0;
float hard_swish_offset = 3.0; float hard_swish_offset = 3.0;
float relu_threshold_ = 1.0; float relu_threshold_ = 1.0;
float elu_alpha_ = 1.0;
DDim dims_{{1}}; DDim dims_{{1}};
std::string type_ = ""; std::string type_ = "";
activation_type_test act_type_ = RELU; activation_type_test act_type_ = RELU;
...@@ -67,6 +69,7 @@ class ActivationComputeTester : public arena::TestCase { ...@@ -67,6 +69,7 @@ class ActivationComputeTester : public arena::TestCase {
float relu_clipped_coef, float relu_clipped_coef,
std::string prelu_mode, std::string prelu_mode,
float swish_beta, float swish_beta,
float elu_alpha,
DDim dims, DDim dims,
std::string type, std::string type,
activation_type_test act_type) activation_type_test act_type)
...@@ -75,6 +78,7 @@ class ActivationComputeTester : public arena::TestCase { ...@@ -75,6 +78,7 @@ class ActivationComputeTester : public arena::TestCase {
relu_clipped_coef_(relu_clipped_coef), relu_clipped_coef_(relu_clipped_coef),
prelu_mode_(prelu_mode), prelu_mode_(prelu_mode),
swish_beta_(swish_beta), swish_beta_(swish_beta),
elu_alpha_(elu_alpha),
dims_(dims), dims_(dims),
type_(type), type_(type),
act_type_(act_type) {} act_type_(act_type) {}
...@@ -87,6 +91,7 @@ class ActivationComputeTester : public arena::TestCase { ...@@ -87,6 +91,7 @@ class ActivationComputeTester : public arena::TestCase {
auto* x = scope->FindTensor(input_); auto* x = scope->FindTensor(input_);
const auto* x_data = x->data<float>(); const auto* x_data = x->data<float>();
LOG(INFO) << act_type_;
switch (act_type_) { switch (act_type_) {
case RELU: { case RELU: {
for (int i = 0; i < dims_.production(); i++) { for (int i = 0; i < dims_.production(); i++) {
...@@ -226,8 +231,17 @@ class ActivationComputeTester : public arena::TestCase { ...@@ -226,8 +231,17 @@ class ActivationComputeTester : public arena::TestCase {
} }
break; break;
} }
case ELU: {
for (int i = 0; i < dims_.production(); i++) {
float tmp = std::exp(x_data[i]) - 1;
float max = x_data[i] > 0.f ? x_data[i] : 0.f;
float min = x_data[i] < 0.f ? elu_alpha_ * tmp : 0.f;
output_data[i] = min + max;
}
}
break;
default: default:
LOG(INFO) << "the type of activation is unknow."; LOG(INFO) << "the type of activation " << act_type_ << " is unknow.";
} }
} }
...@@ -256,6 +270,9 @@ class ActivationComputeTester : public arena::TestCase { ...@@ -256,6 +270,9 @@ class ActivationComputeTester : public arena::TestCase {
if (act_type_ == THRESHOLDED_RELU) { if (act_type_ == THRESHOLDED_RELU) {
op_desc->SetAttr("threshold", relu_threshold_); op_desc->SetAttr("threshold", relu_threshold_);
} }
if (act_type_ == ELU) {
op_desc->SetAttr("alpha", elu_alpha_);
}
} }
void PrepareData() override { void PrepareData() override {
...@@ -309,7 +326,7 @@ TEST(Activation_relu, precision) { ...@@ -309,7 +326,7 @@ TEST(Activation_relu, precision) {
for (auto dims : std::vector<std::vector<int64_t>>{ for (auto dims : std::vector<std::vector<int64_t>>{
{1, 3, 2, 4}, {2, 3, 4}, {5, 4}, {8}}) { {1, 3, 2, 4}, {2, 3, 4}, {5, 4}, {8}}) {
std::unique_ptr<arena::TestCase> tester(new ActivationComputeTester( std::unique_ptr<arena::TestCase> tester(new ActivationComputeTester(
place, "def", 0.01, 6., "all", 0., DDim(dims), "relu", RELU)); place, "def", 0.01, 6., "all", 0., 1.0, DDim(dims), "relu", RELU));
arena::Arena arena(std::move(tester), place, abs_error); arena::Arena arena(std::move(tester), place, abs_error);
arena.TestPrecision(); arena.TestPrecision();
} }
...@@ -338,6 +355,7 @@ TEST(Activation_leaky_relu, precision) { ...@@ -338,6 +355,7 @@ TEST(Activation_leaky_relu, precision) {
6., 6.,
"all", "all",
0., 0.,
1.0,
DDim(dims), DDim(dims),
"leaky_relu", "leaky_relu",
LEAKY_RELU)); LEAKY_RELU));
...@@ -370,6 +388,7 @@ TEST(Activation_relu_clipped, precision) { ...@@ -370,6 +388,7 @@ TEST(Activation_relu_clipped, precision) {
coef, coef,
"all", "all",
0., 0.,
1.0,
DDim(dims), DDim(dims),
"relu_clipped", "relu_clipped",
RELU_CLIPPED)); RELU_CLIPPED));
...@@ -387,7 +406,7 @@ TEST(Activation_prelu, precision) { ...@@ -387,7 +406,7 @@ TEST(Activation_prelu, precision) {
for (auto dims : std::vector<std::vector<int64_t>>{{1, 3, 2, 4}}) { for (auto dims : std::vector<std::vector<int64_t>>{{1, 3, 2, 4}}) {
for (auto mode : {"all", "channel", "element"}) { for (auto mode : {"all", "channel", "element"}) {
std::unique_ptr<arena::TestCase> tester(new ActivationComputeTester( std::unique_ptr<arena::TestCase> tester(new ActivationComputeTester(
place, "def", 0.01, 6, mode, 0., DDim(dims), "prelu", PRELU)); place, "def", 0.01, 6, mode, 0., 1.0, DDim(dims), "prelu", PRELU));
arena::Arena arena(std::move(tester), place, 2e-5); arena::Arena arena(std::move(tester), place, 2e-5);
arena.TestPrecision(); arena.TestPrecision();
} }
...@@ -411,7 +430,7 @@ TEST(Activation_sigmoid, precision) { ...@@ -411,7 +430,7 @@ TEST(Activation_sigmoid, precision) {
for (auto dims : std::vector<std::vector<int64_t>>{ for (auto dims : std::vector<std::vector<int64_t>>{
{1, 3, 2, 4}, {2, 3, 4}, {5, 4}, {8}}) { {1, 3, 2, 4}, {2, 3, 4}, {5, 4}, {8}}) {
std::unique_ptr<arena::TestCase> tester(new ActivationComputeTester( std::unique_ptr<arena::TestCase> tester(new ActivationComputeTester(
place, "def", 0.01, 6., "all", 0., DDim(dims), "sigmoid", SIGMOID)); place, "def", 0.01, 6., "all", 0., 1.0, DDim(dims), "sigmoid", SIGMOID));
arena::Arena arena(std::move(tester), place, abs_error); arena::Arena arena(std::move(tester), place, abs_error);
arena.TestPrecision(); arena.TestPrecision();
} }
...@@ -435,7 +454,7 @@ TEST(Activation_tanh, precision) { ...@@ -435,7 +454,7 @@ TEST(Activation_tanh, precision) {
for (auto dims : std::vector<std::vector<int64_t>>{ for (auto dims : std::vector<std::vector<int64_t>>{
{1, 3, 2, 4}, {2, 3, 4}, {5, 4}, {8}}) { {1, 3, 2, 4}, {2, 3, 4}, {5, 4}, {8}}) {
std::unique_ptr<arena::TestCase> tester(new ActivationComputeTester( std::unique_ptr<arena::TestCase> tester(new ActivationComputeTester(
place, "def", 0.01, 6., "all", 0., DDim(dims), "tanh", TANH)); place, "def", 0.01, 6., "all", 0., 1.0, DDim(dims), "tanh", TANH));
arena::Arena arena(std::move(tester), place, abs_error); arena::Arena arena(std::move(tester), place, abs_error);
arena.TestPrecision(); arena.TestPrecision();
} }
...@@ -450,7 +469,7 @@ TEST(Activation_swish, precision) { ...@@ -450,7 +469,7 @@ TEST(Activation_swish, precision) {
{1, 3, 2, 4}, {2, 3, 4}, {5, 4}, {8}}) { {1, 3, 2, 4}, {2, 3, 4}, {5, 4}, {8}}) {
for (auto coef : {0.01, 0.1}) { for (auto coef : {0.01, 0.1}) {
std::unique_ptr<arena::TestCase> tester(new ActivationComputeTester( std::unique_ptr<arena::TestCase> tester(new ActivationComputeTester(
place, "def", 0.01, 6, "all", coef, DDim(dims), "swish", SWISH)); place, "def", 0.01, 6, "all", coef, 1.0, DDim(dims), "swish", SWISH));
arena::Arena arena(std::move(tester), place, 2e-5); arena::Arena arena(std::move(tester), place, 2e-5);
arena.TestPrecision(); arena.TestPrecision();
} }
...@@ -474,7 +493,7 @@ TEST(Activation_relu6, precision) { ...@@ -474,7 +493,7 @@ TEST(Activation_relu6, precision) {
for (auto dims : std::vector<std::vector<int64_t>>{ for (auto dims : std::vector<std::vector<int64_t>>{
{1, 3, 2, 4}, {2, 3, 4}, {5, 4}, {8}}) { {1, 3, 2, 4}, {2, 3, 4}, {5, 4}, {8}}) {
std::unique_ptr<arena::TestCase> tester(new ActivationComputeTester( std::unique_ptr<arena::TestCase> tester(new ActivationComputeTester(
place, "def", 0.01, 6., "all", 0., DDim(dims), "relu6", RELU6)); place, "def", 0.01, 6., "all", 0., 1.0, DDim(dims), "relu6", RELU6));
arena::Arena arena(std::move(tester), place, abs_error); arena::Arena arena(std::move(tester), place, abs_error);
arena.TestPrecision(); arena.TestPrecision();
} }
...@@ -496,7 +515,7 @@ TEST(Activation_log, precision) { ...@@ -496,7 +515,7 @@ TEST(Activation_log, precision) {
for (auto dims : std::vector<std::vector<int64_t>>{ for (auto dims : std::vector<std::vector<int64_t>>{
{1, 3, 2, 4}, {2, 3, 4}, {5, 4}, {8}}) { {1, 3, 2, 4}, {2, 3, 4}, {5, 4}, {8}}) {
std::unique_ptr<arena::TestCase> tester(new ActivationComputeTester( std::unique_ptr<arena::TestCase> tester(new ActivationComputeTester(
place, "def", 0.01, 6., "all", 0., DDim(dims), "log", LOG)); place, "def", 0.01, 6., "all", 0., 1.0, DDim(dims), "log", LOG));
arena::Arena arena(std::move(tester), place, abs_error); arena::Arena arena(std::move(tester), place, abs_error);
arena.TestPrecision(); arena.TestPrecision();
} }
...@@ -510,7 +529,7 @@ TEST(Activation_exp, precision) { ...@@ -510,7 +529,7 @@ TEST(Activation_exp, precision) {
for (auto dims : std::vector<std::vector<int64_t>>{ for (auto dims : std::vector<std::vector<int64_t>>{
{1, 3, 2, 4}, {2, 3, 4}, {5, 4}, {8}}) { {1, 3, 2, 4}, {2, 3, 4}, {5, 4}, {8}}) {
std::unique_ptr<arena::TestCase> tester(new ActivationComputeTester( std::unique_ptr<arena::TestCase> tester(new ActivationComputeTester(
place, "def", 0.01, 6., "all", 0., DDim(dims), "exp", EXP)); place, "def", 0.01, 6., "all", 0., 1.0, DDim(dims), "exp", EXP));
arena::Arena arena(std::move(tester), place, 2e-5); arena::Arena arena(std::move(tester), place, 2e-5);
arena.TestPrecision(); arena.TestPrecision();
} }
...@@ -524,7 +543,7 @@ TEST(Activation_floor, precision) { ...@@ -524,7 +543,7 @@ TEST(Activation_floor, precision) {
for (auto dims : std::vector<std::vector<int64_t>>{ for (auto dims : std::vector<std::vector<int64_t>>{
{1, 3, 2, 4}, {2, 3, 4}, {5, 4}, {8}}) { {1, 3, 2, 4}, {2, 3, 4}, {5, 4}, {8}}) {
std::unique_ptr<arena::TestCase> tester(new ActivationComputeTester( std::unique_ptr<arena::TestCase> tester(new ActivationComputeTester(
place, "def", 0.01, 6., "all", 0., DDim(dims), "floor", FLOOR)); place, "def", 0.01, 6., "all", 0., 1.0, DDim(dims), "floor", FLOOR));
arena::Arena arena(std::move(tester), place, 2e-5); arena::Arena arena(std::move(tester), place, 2e-5);
arena.TestPrecision(); arena.TestPrecision();
} }
...@@ -539,7 +558,7 @@ TEST(Activation_rsqrt, precision) { ...@@ -539,7 +558,7 @@ TEST(Activation_rsqrt, precision) {
for (auto dims : std::vector<std::vector<int64_t>>{ for (auto dims : std::vector<std::vector<int64_t>>{
{1, 3, 2, 4}, {2, 3, 4}, {5, 4}, {8}}) { {1, 3, 2, 4}, {2, 3, 4}, {5, 4}, {8}}) {
std::unique_ptr<arena::TestCase> tester(new ActivationComputeTester( std::unique_ptr<arena::TestCase> tester(new ActivationComputeTester(
place, "def", 0.01, 6., "all", 0., DDim(dims), "rsqrt", RSQRT)); place, "def", 0.01, 6., "all", 0., 1.0, DDim(dims), "rsqrt", RSQRT));
arena::Arena arena(std::move(tester), place, 2e-5); arena::Arena arena(std::move(tester), place, 2e-5);
arena.TestPrecision(); arena.TestPrecision();
} }
...@@ -562,7 +581,7 @@ TEST(Activation_square, precision) { ...@@ -562,7 +581,7 @@ TEST(Activation_square, precision) {
for (auto dims : std::vector<std::vector<int64_t>>{ for (auto dims : std::vector<std::vector<int64_t>>{
{1, 3, 2, 4}, {2, 3, 4}, {5, 4}, {8}}) { {1, 3, 2, 4}, {2, 3, 4}, {5, 4}, {8}}) {
std::unique_ptr<arena::TestCase> tester(new ActivationComputeTester( std::unique_ptr<arena::TestCase> tester(new ActivationComputeTester(
place, "def", 0.01, 6., "all", 0., DDim(dims), "square", SQUARE)); place, "def", 0.01, 6., "all", 0., 1.0, DDim(dims), "square", SQUARE));
arena::Arena arena(std::move(tester), place, abs_error); arena::Arena arena(std::move(tester), place, abs_error);
arena.TestPrecision(); arena.TestPrecision();
} }
...@@ -581,7 +600,7 @@ TEST(Activation_gelu, precision) { ...@@ -581,7 +600,7 @@ TEST(Activation_gelu, precision) {
for (auto dims : std::vector<std::vector<int64_t>>{ for (auto dims : std::vector<std::vector<int64_t>>{
{1, 3, 2, 4}, {2, 3, 4}, {5, 4}, {8}}) { {1, 3, 2, 4}, {2, 3, 4}, {5, 4}, {8}}) {
std::unique_ptr<arena::TestCase> tester(new ActivationComputeTester( std::unique_ptr<arena::TestCase> tester(new ActivationComputeTester(
place, "def", 0.01, 6., "all", 0., DDim(dims), "gelu", GELU)); place, "def", 0.01, 6., "all", 0., 1.0, DDim(dims), "gelu", GELU));
arena::Arena arena(std::move(tester), place, abs_error); arena::Arena arena(std::move(tester), place, abs_error);
arena.TestPrecision(); arena.TestPrecision();
} }
...@@ -607,6 +626,7 @@ TEST(activation_hard_swish, precision) { ...@@ -607,6 +626,7 @@ TEST(activation_hard_swish, precision) {
6., 6.,
"all", "all",
0., 0.,
1.0,
DDim(dims), DDim(dims),
"hard_swish", "hard_swish",
HARD_SWISH)); HARD_SWISH));
...@@ -635,6 +655,7 @@ TEST(activation_reciprocal, precision) { ...@@ -635,6 +655,7 @@ TEST(activation_reciprocal, precision) {
6., 6.,
"all", "all",
0., 0.,
1.0,
DDim(dims), DDim(dims),
"reciprocal", "reciprocal",
RECIPROCAL)); RECIPROCAL));
...@@ -665,6 +686,7 @@ TEST(Activation_thresholded_relu, precision) { ...@@ -665,6 +686,7 @@ TEST(Activation_thresholded_relu, precision) {
6., 6.,
"all", "all",
0., 0.,
1.0,
DDim(dims), DDim(dims),
"thresholded_relu", "thresholded_relu",
THRESHOLDED_RELU)); THRESHOLDED_RELU));
...@@ -673,5 +695,20 @@ TEST(Activation_thresholded_relu, precision) { ...@@ -673,5 +695,20 @@ TEST(Activation_thresholded_relu, precision) {
} }
} }
TEST(Activation_elu, precision) {
LOG(INFO) << "test elu op";
#ifdef LITE_WITH_ARM
Place place(TARGET(kARM));
for (auto dims : std::vector<std::vector<int64_t>>{
{1, 3, 2, 4}, {2, 3, 4}, {5, 4}, {8}}) {
std::unique_ptr<arena::TestCase> tester(new ActivationComputeTester(
place, "def", 0.01, 6., "all", 0., 1.0, DDim(dims), "elu", ELU));
arena::Arena arena(std::move(tester), place, 2e-5);
arena.TestPrecision();
}
#endif
}
} // namespace lite } // namespace lite
} // namespace paddle } // namespace paddle
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册