Реализация функции ReLU при переполнении стека

Я на самом деле работаю над CNN, я использую Sigmoid для функции активации, но я хотел бы использовать ReLU.

Я реализовал код для ReLU с использованием Eigen, но он не работает, не могли бы вы мне помочь, пожалуйста?

Вот мой код:

Matrix ReLu(const Matrix & x){

Matrix A;
for( int i = 0; i< x.rows(); ++i )
for (int j=0; i< x.cols(); j++) {
if (x(i,j) <= 0){
A(i,j)=(0.0);
}
else A(i,j)=(x(i,j));
}
return std::move(A.matrix());
}

Matrix ReLu_deriv (const Matrix& y) {
Matrix B;
for( int i = 0; i < y.rows(); ++i )
for (int j=0; i < y.cols() ; j++)
{
{
if (y(i,j) <= 0.0){
B(i,j)=(0.0);
}
else B(i,j)=(1.0);
}
return std::move(B.matrix());
}

и ошибка:

> /usr/include/eigen3/Eigen/src/Core/DenseCoeffsBase.h :365 : Eigen::DenseCoeffsBase<Derived,
> 1>::Scalar& Eigen::DenseCoeffsBase<Derived,
> 1>::operator()(Eigen::Index, Eigen::Index) [with Derived =
> Eigen::Matrix<double, -1, -1>; Eigen::DenseCoeffsBase<Derived,
> 1>::Scalar = double; Eigen::Index = long int]:  l'assertion « row >= 0
> && row < rows() && col >= 0 && col < cols() » a échoué.

1

Решение

Сначала вам нужно правильно инициализировать временную матрицу:

Matrix ReLu(const Matrix & x){

Matrix A(x.rows(), x.cols());
for( int i = 0; i< x.rows(); ++i )
for (int j=0; j< x.cols(); ++j) {
if (x(i,j) <= 0){
A(i,j)=(0.0);
}
else A(i,j)=(x(i,j));
}
return std::move(A.matrix());
}

Matrix ReLu_deriv (const Matrix& y) {
Matrix B(y.rows(), y.cols());
for( int i = 0; i < y.rows(); ++i )
for (int j=0; j < y.cols() ; ++j)
{
if (y(i,j) <= 0.0){
B(i,j)=(0.0);
}
else B(i,j)=(1.0);
}
return std::move(B.matrix());
}
2

Другие решения

В обоих циклах у вас есть опечатка:

for( int i = 0; i< x.rows(); ++i )
for (int j=0; i< x.cols(); j++) { \\ replace i with j
---------------------------------------------------------
for( int i = 0; i< x.rows(); ++i )
for (int j=0; i< x.cols(); j++) { \\replace i with j
2

По вопросам рекламы [email protected]