Skip to content

Commit 0c837e7

Browse files
committed
add sigmoid in ewlayer
1 parent b35c658 commit 0c837e7

2 files changed

Lines changed: 28 additions & 1 deletion

File tree

include/layers/EWLayer.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,11 @@ std::vector<ValueType> EWLayerImpl<ValueType>::run(
8787
static_cast<ValueType>(beta_);
8888
};
8989
std::transform(input.begin(), input.end(), res.begin(), linear);
90+
} else if (func_ == "sigmoid") {
91+
auto sigmoid = [&](const ValueType& value) -> ValueType {
92+
return static_cast<ValueType>(1.0 / (1.0 + std::exp(-value)));
93+
};
94+
std::transform(input.begin(), input.end(), res.begin(), sigmoid);
9095
} else {
9196
throw std::invalid_argument("No such function for EWLayer");
9297
}

test/single_layer/test_ewlayer.cpp

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,13 @@ INSTANTIATE_TEST_SUITE_P(
5454
std::make_tuple(basic_data2,
5555
EWLayerImpl<double>({2, 2}, "linear", 2.0F, 1.0F),
5656
std::vector<double>({3.0, -1.0, 5.0, -3.0}),
57-
std::function<double(double)>())));
57+
std::function<double(double)>()),
58+
std::make_tuple(std::vector<double>({0.0, 1.0, -1.0}),
59+
EWLayerImpl<double>({3}, "sigmoid"),
60+
std::vector<double>(),
61+
std::function<double(double)>([](double x) {
62+
return 1.0 / (1.0 + std::exp(-x));
63+
}))));
5864

5965
TEST(ewlayer, new_ewlayer_can_relu_float) {
6066
EWLayer layer("relu");
@@ -100,3 +106,19 @@ TEST(ewlayer, new_ewlayer_throws_with_invalid_function) {
100106
TEST(ewlayer, get_layer_name) {
101107
EXPECT_EQ(EWLayer::get_name(), "Element-wise layer");
102108
}
109+
110+
TEST(ewlayer, new_ewlayer_can_sigmoid_float) {
111+
EWLayer layer("sigmoid");
112+
Tensor input = make_tensor<float>({0.0F, -1.0F, 1.0F, 2.0F});
113+
Tensor output;
114+
std::vector<float> expected_output = {
115+
0.5F,
116+
1.0F / (1.0F + std::exp(1.0F)),
117+
1.0F / (1.0F + std::exp(-1.0F)),
118+
1.0F / (1.0F + std::exp(-2.0F))
119+
};
120+
layer.run(input, output);
121+
for (size_t i = 0; i < 4; i++) {
122+
EXPECT_NEAR((*output.as<float>())[i], expected_output[i], 1e-5F);
123+
}
124+
}

0 commit comments

Comments
 (0)