diff --git a/include/aidge/backend/cpu/operator/LeakyReLUImpl.hpp b/include/aidge/backend/cpu/operator/LeakyReLUImpl.hpp index 1e8c1a14435f53ad7a63b327944e0bb8c70c8661..d4037901a5b0c7da5396dc435e237493023fb6f2 100644 --- a/include/aidge/backend/cpu/operator/LeakyReLUImpl.hpp +++ b/include/aidge/backend/cpu/operator/LeakyReLUImpl.hpp @@ -32,6 +32,7 @@ using LeakyReLUImpl_cpu = OperatorImpl_cpu<LeakyReLU_Op, void(const float, std::size_t, const void*, + const void*, void*)>; // Implementation entry point registration to Operator diff --git a/include/aidge/backend/cpu/operator/LeakyReLUImpl_kernels.hpp b/include/aidge/backend/cpu/operator/LeakyReLUImpl_kernels.hpp index 7afd8298329a285ce72106dbc766546076cfb37e..1b4c3053dbe6161dc27e6e78826a69fea0c5ab6c 100644 --- a/include/aidge/backend/cpu/operator/LeakyReLUImpl_kernels.hpp +++ b/include/aidge/backend/cpu/operator/LeakyReLUImpl_kernels.hpp @@ -36,14 +36,16 @@ template <class I, class O> void LeakyReLUImpl_cpu_backward_kernel(const float negativeSlope_, std::size_t inputLength, const void* input_, - void* output_) { + const void* grad_output_, + void* grad_input_) { - const I* input = static_cast<const I*>(input_); - O* output = static_cast<O*>(output_); + const O* input = static_cast<const O*>(input_); + const I* grad_output = static_cast<const I*>(grad_output_); + O* grad_input = static_cast<O*>(grad_input_); const I negativeSlope = static_cast<const I>(negativeSlope_); for (std::size_t i = 0; i < inputLength; ++i) { - output[i] = (input[i] > 0) ? input[i] : negativeSlope*input[i]; + grad_input[i] = (input[i] > 0) ? grad_output[i] : negativeSlope*grad_output[i]; } } diff --git a/include/aidge/backend/cpu/operator/SqrtImpl.hpp b/include/aidge/backend/cpu/operator/SqrtImpl.hpp index dba75d1c58fb19ab2284ee0e98a32bff7ac58557..2f24277fe4c02d52d7260d788a5dcd92a08c4d48 100644 --- a/include/aidge/backend/cpu/operator/SqrtImpl.hpp +++ b/include/aidge/backend/cpu/operator/SqrtImpl.hpp @@ -26,7 +26,7 @@ namespace Aidge { // Operator implementation entry point for the backend using SqrtImpl_cpu = OperatorImpl_cpu<Sqrt_Op, void(const std::size_t, const void*, void*), - void(const std::size_t, const void*, void*)>; + void(const std::size_t, const void*, const void*, void*)>; // Implementation entry point registration to Operator REGISTRAR(Sqrt_Op, "cpu", Aidge::SqrtImpl_cpu::create); diff --git a/include/aidge/backend/cpu/operator/SqrtImpl_kernels.hpp b/include/aidge/backend/cpu/operator/SqrtImpl_kernels.hpp index 1ce1ef9b675ac6924e5e543f2bdfa4a79e8a8b30..bccc195efff4580f4229c1b1d3668bb6ef0ba9ed 100644 --- a/include/aidge/backend/cpu/operator/SqrtImpl_kernels.hpp +++ b/include/aidge/backend/cpu/operator/SqrtImpl_kernels.hpp @@ -35,14 +35,16 @@ void SqrtImpl_cpu_forward_kernel(const std::size_t inputLength, template <class I, class O> void SqrtImpl_cpu_backward_kernel(const std::size_t inputLength, - const void* input_, - void* output_) { + const void* output_, + const void* grad_output_, + void* grad_input_) { - const I* input = static_cast<const I*>(input_); - O* output = static_cast<O*>(output_); + const I* output = static_cast<const I*>(output_); + const I* grad_output = static_cast<const I*>(grad_output_); + O* grad_input = static_cast<O*>(grad_input_); for (std::size_t i = 0; i < inputLength; ++i) { - output[i] = static_cast<O>(0.5/(std::sqrt(static_cast<float>(input[i])))); + grad_input[i] = static_cast<O>(0.5/output[i]) * grad_output[i]; } } diff --git a/src/operator/LeakyReLUImpl.cpp b/src/operator/LeakyReLUImpl.cpp index 6c0802dd967d2a20b34a2f1ca91fc0640c063c83..2178ecc4f116913e5357411fb35936e52d860cb8 100644 --- a/src/operator/LeakyReLUImpl.cpp +++ b/src/operator/LeakyReLUImpl.cpp @@ -43,8 +43,9 @@ template <> void Aidge::LeakyReLUImpl_cpu::backward() { // reversing in and out Data for backprop const LeakyReLU_Op& op_ = dynamic_cast<const LeakyReLU_Op&>(mOp); - std::shared_ptr<Tensor> in0 = op_.getOutput(0)->grad(); - std::shared_ptr<Tensor> out0 = op_.getInput(0)->grad(); + std::shared_ptr<Tensor> in0 = op_.getInput(0)->grad(); + std::shared_ptr<Tensor> out0grad = op_.getOutput(0)->grad(); + std::shared_ptr<Tensor> in0grad = op_.getInput(0)->grad(); AIDGE_ASSERT(in0, "missing input #0"); // Find the correct kernel type @@ -52,7 +53,8 @@ void Aidge::LeakyReLUImpl_cpu::backward() { // Call kernel impl.backward(op_.negativeSlope(), - in0->size(), + out0grad->size(), getCPUPtr(in0), - getCPUPtr(out0)); + getCPUPtr(out0grad), + getCPUPtr(in0grad)); } \ No newline at end of file diff --git a/src/operator/SqrtImpl.cpp b/src/operator/SqrtImpl.cpp index 25bdb42fd5140ef4f64d704fc3a5ccf237f17f81..d93bfe1f3edadf28a68b0fa627593378306bb2cb 100644 --- a/src/operator/SqrtImpl.cpp +++ b/src/operator/SqrtImpl.cpp @@ -40,6 +40,7 @@ template <> void Aidge::SqrtImpl_cpu::backward() { // reversing in and out Data for backprop const Sqrt_Op& op_ = dynamic_cast<const Sqrt_Op&>(mOp); + std::shared_ptr<Tensor> out0 = op_.getOutput(0); std::shared_ptr<Tensor> out0grad = op_.getOutput(0)->grad(); std::shared_ptr<Tensor> in0grad = op_.getInput(0)->grad(); AIDGE_ASSERT(out0grad, "missing output #0"); @@ -49,6 +50,7 @@ void Aidge::SqrtImpl_cpu::backward() { // Call kernel impl.backward(out0grad->size(), + getCPUPtr(out0), getCPUPtr(out0grad), getCPUPtr(in0grad)); } \ No newline at end of file