diff --git a/include/aidge/backend/cpu/operator/AtanImpl_kernels.hpp b/include/aidge/backend/cpu/operator/AtanImpl_kernels.hpp index 141e5b60ec3680c6c66ef6552704a57a41a8cf27..e82f34fcbd7c5dd2993e05184b76143c66976436 100644 --- a/include/aidge/backend/cpu/operator/AtanImpl_kernels.hpp +++ b/include/aidge/backend/cpu/operator/AtanImpl_kernels.hpp @@ -43,7 +43,7 @@ void AtanImpl_cpu_backward_kernel(const std::size_t inputLength, // Apply the derivative of atan for each element in the input array for (size_t i = 0; i < inputLength; ++i) { // dx = dy * (1 / (1 + x^2)) - grad_input[i] = grad_output[i] * static_cast<O>(1.0 / (1.0 + output[i] * output[i])); + grad_input[i] += grad_output[i] * static_cast<O>(1.0 / (1.0 + output[i] * output[i])); } } diff --git a/include/aidge/backend/cpu/operator/ClipImpl_kernels.hpp b/include/aidge/backend/cpu/operator/ClipImpl_kernels.hpp index f7a645854271f755a622a63c7945a00562b59282..65bf5094debe887d2ef7018fbf4880916d4d48d1 100644 --- a/include/aidge/backend/cpu/operator/ClipImpl_kernels.hpp +++ b/include/aidge/backend/cpu/operator/ClipImpl_kernels.hpp @@ -48,7 +48,7 @@ void ClipImpl_cpu_backward_kernel( GI* grad_input = static_cast<GI*>(grad_input_); for (std::size_t i = 0; i < length; ++i) { - grad_input[i] = ((input[i] > min_) && (input[i] < max_)) ? grad_output[i] : 0; + grad_input[i] += ((input[i] > min_) && (input[i] < max_)) ? grad_output[i] : 0; } } diff --git a/include/aidge/backend/cpu/operator/HeavisideImpl_kernels.hpp b/include/aidge/backend/cpu/operator/HeavisideImpl_kernels.hpp index 92f12fbed5c6530a6c5b57e74d2b46446533ca02..c823b2942ea6cbc975bac71f30b3c94aca546c11 100644 --- a/include/aidge/backend/cpu/operator/HeavisideImpl_kernels.hpp +++ b/include/aidge/backend/cpu/operator/HeavisideImpl_kernels.hpp @@ -54,7 +54,7 @@ void HeavisideImplCpuBackwardKernel(std::size_t inputLength, GI* grad_input = static_cast<GI*>(grad_input_); for (size_t i = 0; i < inputLength; ++i) { - grad_input[i] = grad_output[i] * static_cast<O>(1.0 / (1.0 + (output[i] * M_PI) * (output[i] * M_PI))); + grad_input[i] += grad_output[i] * static_cast<O>(1.0 / (1.0 + (output[i] * M_PI) * (output[i] * M_PI))); } } diff --git a/include/aidge/backend/cpu/operator/LeakyReLUImpl_kernels.hpp b/include/aidge/backend/cpu/operator/LeakyReLUImpl_kernels.hpp index 1b4c3053dbe6161dc27e6e78826a69fea0c5ab6c..236038c689fa2ef5005b8753f5fc0cbdbce68bd1 100644 --- a/include/aidge/backend/cpu/operator/LeakyReLUImpl_kernels.hpp +++ b/include/aidge/backend/cpu/operator/LeakyReLUImpl_kernels.hpp @@ -45,7 +45,7 @@ void LeakyReLUImpl_cpu_backward_kernel(const float negativeSlope_, const I negativeSlope = static_cast<const I>(negativeSlope_); for (std::size_t i = 0; i < inputLength; ++i) { - grad_input[i] = (input[i] > 0) ? grad_output[i] : negativeSlope*grad_output[i]; + grad_input[i] += (input[i] > 0) ? grad_output[i] : negativeSlope*grad_output[i]; } } diff --git a/include/aidge/backend/cpu/operator/LnImpl_kernels.hpp b/include/aidge/backend/cpu/operator/LnImpl_kernels.hpp index ee2864b6a650214bf1705a158b0ec3e88a7b7b16..8b57b417f64b3fcdd803483f0ea69a8a57c5cc7d 100755 --- a/include/aidge/backend/cpu/operator/LnImpl_kernels.hpp +++ b/include/aidge/backend/cpu/operator/LnImpl_kernels.hpp @@ -48,9 +48,7 @@ void LnImpl_cpu_backward_kernel(const std::size_t inputLength, for (std::size_t i = 0; i < inputLength; ++i) { if (input[i] > I(eps)) { - grad_input[i] = grad_output[i] / input[i]; - } else { - grad_input[i] = GI(0); + grad_input[i] += grad_output[i] / input[i]; } } } diff --git a/include/aidge/backend/cpu/operator/MaxPoolingImpl_kernels.hpp b/include/aidge/backend/cpu/operator/MaxPoolingImpl_kernels.hpp index 7fe272d5d23d6484ed03c6183a1972035aa1b563..3057878d1ff90f46f5eb5ab887065dc5b4cede3f 100644 --- a/include/aidge/backend/cpu/operator/MaxPoolingImpl_kernels.hpp +++ b/include/aidge/backend/cpu/operator/MaxPoolingImpl_kernels.hpp @@ -149,12 +149,6 @@ void MaxPoolingImpl2D_cpu_backward_kernel( const I *input = static_cast<const I *>(input_); I *grad = static_cast<I *>(grad_); - // Fill the gradient with 0 to avoid garbage data - std::fill(grad, - grad + (dims[0] * dims[1] * dims[2] * dims[3]), - static_cast<I>(0) - ); - // output H size auto hOut = static_cast<float>( dims[2] - (kernelDims[0] - 1) * dilations[0] - 1 + strideDims[0] diff --git a/include/aidge/backend/cpu/operator/MulImpl_kernels.hpp b/include/aidge/backend/cpu/operator/MulImpl_kernels.hpp index 36acb9199c51e900287ca9b262322aa86287d838..a88923fd67dae21ab196f076d6a6c932bfd930f1 100644 --- a/include/aidge/backend/cpu/operator/MulImpl_kernels.hpp +++ b/include/aidge/backend/cpu/operator/MulImpl_kernels.hpp @@ -166,9 +166,6 @@ void MulImpl_cpu_backward_kernel(const std::size_t input0Length, auto* grad_input_0 = static_cast<I1*>(gradientInput0_); auto* grad_input_1 = static_cast<I2*>(gradientInput1_); - std::fill_n(grad_input_0, input0Length, static_cast<I1>(0)); - std::fill_n(grad_input_1, input1Length, static_cast<I2>(0)); - // Broadcast dims0 and dims1 to match the shape of outputDims auto broadcastedDims0 = getBroadcastedDims(outputDims, dims0); auto broadcastedDims1 = getBroadcastedDims(outputDims, dims1); diff --git a/include/aidge/backend/cpu/operator/PowImpl_kernels.hpp b/include/aidge/backend/cpu/operator/PowImpl_kernels.hpp index cae106632053366e1370b5ce1d3a2ee4cfd3b62b..51fd1bb62a94df5854a476f311f0e4e33a132ab0 100644 --- a/include/aidge/backend/cpu/operator/PowImpl_kernels.hpp +++ b/include/aidge/backend/cpu/operator/PowImpl_kernels.hpp @@ -163,12 +163,6 @@ void PowImpl_cpu_backward_kernel(const std::vector<std::size_t>& input0Dims, I2* grad1 = static_cast<I2*>(gradientInput1_); const O* gradOut = static_cast<const O*>(gradOutput_); - // Fill input grads with zeros - std::size_t input0Elements = std::accumulate(input0Dims.cbegin(), input0Dims.cend(), std::size_t(1), std::multiplies<std::size_t>()); - std::fill(grad0, grad0 + input0Elements, I1(0)); - std::size_t input1Elements = std::accumulate(input1Dims.cbegin(), input1Dims.cend(), std::size_t(1), std::multiplies<std::size_t>()); - std::fill(grad1, grad1 + input1Elements, I2(0)); - std::size_t totalElements = std::accumulate(outputDims.cbegin(), outputDims.cend(), std::size_t(1), std::multiplies<std::size_t>()); for (size_t oIndex = 0; oIndex < totalElements; ++oIndex) { diff --git a/include/aidge/backend/cpu/operator/ReLUImpl_kernels.hpp b/include/aidge/backend/cpu/operator/ReLUImpl_kernels.hpp index 6b7c3c9c58e0a3426a641466fd584a68dd8cccaa..3789052cac7b9b082cbf86cee1ce62ab486b556a 100644 --- a/include/aidge/backend/cpu/operator/ReLUImpl_kernels.hpp +++ b/include/aidge/backend/cpu/operator/ReLUImpl_kernels.hpp @@ -47,7 +47,7 @@ void ReLUImpl_cpu_backward_kernel(const std::size_t inputLength, const GO* grad_output = static_cast<const GO*>(grad_output_); GI* grad_input = static_cast<GI*>(grad_input_); for (std::size_t i = 0; i < inputLength; ++i) { - grad_input[i] = (input[i] > 0) ? grad_output[i] : 0; + grad_input[i] += (input[i] > 0) ? grad_output[i] : 0; } } diff --git a/include/aidge/backend/cpu/operator/SigmoidImpl_kernels.hpp b/include/aidge/backend/cpu/operator/SigmoidImpl_kernels.hpp index 83ad4575f1aae1cee48a0ba33f2455204b26ac9a..b3446dba400e8a771e163d641ee64fd092518bac 100644 --- a/include/aidge/backend/cpu/operator/SigmoidImpl_kernels.hpp +++ b/include/aidge/backend/cpu/operator/SigmoidImpl_kernels.hpp @@ -43,7 +43,7 @@ void SigmoidImpl_cpu_backward_kernel(const std::size_t inputLength, const GO* grad_output = static_cast<const GO*>(grad_output_); GI* grad_input = static_cast<GI*>(grad_input_); for (std::size_t i = 0; i < inputLength; ++i) { - grad_input[i] = output[i] * (O(1) - output[i]) * grad_output[i]; + grad_input[i] += output[i] * (O(1) - output[i]) * grad_output[i]; } } diff --git a/include/aidge/backend/cpu/operator/SqrtImpl_kernels.hpp b/include/aidge/backend/cpu/operator/SqrtImpl_kernels.hpp index bccc195efff4580f4229c1b1d3668bb6ef0ba9ed..beddc74d95b16d08074c675f189c7e30061d4e28 100644 --- a/include/aidge/backend/cpu/operator/SqrtImpl_kernels.hpp +++ b/include/aidge/backend/cpu/operator/SqrtImpl_kernels.hpp @@ -44,7 +44,7 @@ void SqrtImpl_cpu_backward_kernel(const std::size_t inputLength, O* grad_input = static_cast<O*>(grad_input_); for (std::size_t i = 0; i < inputLength; ++i) { - grad_input[i] = static_cast<O>(0.5/output[i]) * grad_output[i]; + grad_input[i] += static_cast<O>(0.5/output[i]) * grad_output[i]; } } diff --git a/include/aidge/backend/cpu/operator/SubImpl_kernels.hpp b/include/aidge/backend/cpu/operator/SubImpl_kernels.hpp index 8d3d80e93e2e2f95d00026b9f3d1a1ff48b8d17a..751177a7c845fc55f2c2e932c0f6ba76bd0ba9ad 100644 --- a/include/aidge/backend/cpu/operator/SubImpl_kernels.hpp +++ b/include/aidge/backend/cpu/operator/SubImpl_kernels.hpp @@ -165,9 +165,6 @@ void SubImpl_cpu_backward_kernel(const std::size_t input0Length, auto* grad_input_0 = static_cast<I1*>(gradientInput0_); auto* grad_input_1 = static_cast<I2*>(gradientInput1_); - std::fill_n(grad_input_0, input0Length, static_cast<I1>(0)); - std::fill_n(grad_input_1, input1Length, static_cast<I2>(0)); - auto broadcastedDims0 = getBroadcastedDims(outputDims, dims0); auto broadcastedDims1 = getBroadcastedDims(outputDims, dims1); diff --git a/include/aidge/backend/cpu/operator/TanhImpl_kernels.hpp b/include/aidge/backend/cpu/operator/TanhImpl_kernels.hpp index 49cfe9cbe97320e53b982e388a19e23370423d26..ca4510d9353e2ce07102989577b67b81e9f1811c 100644 --- a/include/aidge/backend/cpu/operator/TanhImpl_kernels.hpp +++ b/include/aidge/backend/cpu/operator/TanhImpl_kernels.hpp @@ -39,7 +39,7 @@ void TanhImpl_cpu_backward_kernel(const std::size_t inputLength, const GO* grad_output = static_cast<const GO*>(grad_output_); GI* grad_input = static_cast<GI*>(grad_input_); for (std::size_t i = 0; i < inputLength; ++i) { - grad_input[i] = (O(1) - output[i] * output[i]) * grad_output[i]; + grad_input[i] += (O(1) - output[i] * output[i]) * grad_output[i]; } } diff --git a/unit_tests/operator/Test_MaxPoolingImpl.cpp b/unit_tests/operator/Test_MaxPoolingImpl.cpp index 2bc5e1eea1e55bcda8e858585fe5c8222989be60..e4d171c5cd8e9b33b08f271c3bb6d33fd0870948 100644 --- a/unit_tests/operator/Test_MaxPoolingImpl.cpp +++ b/unit_tests/operator/Test_MaxPoolingImpl.cpp @@ -345,7 +345,7 @@ TEST_CASE("[cpu/operator] MaxPooling(backward)", "[MaxPooling][CPU]") { }}} }; - //op2->resetInput(0); + myInput4->setGrad(nullptr); op2->associateInput(0, myInput4); op2->setDataType(DataType::Float32); op2->setBackend("cpu");