【发布时间】:2018-07-06 11:39:49
【问题描述】:
我实际上正在研究 CNN,我正在使用 Sigmoid 作为激活函数,但我想使用 ReLU。
我已经使用 Eigen 实现了一个 ReLU 代码,但它似乎不起作用,你能帮帮我吗?
这是我的代码:
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é.
【问题讨论】:
-
输出是什么(以及预期输出是什么)?
-
“它似乎不起作用”是什么意思?您是否收到编译器错误(您应该这样做)?
-
对不起,我忘了准确地说。我刚才报错了。
-
对不起,我不知道 Eigen。您显示的代码无法编译。您的方法
ReLu_deriv的左括号{比右括号}多。然后我会假设,在这两种方法中,您的矩阵 A 和 B 都没有正确初始化,缺少维度。那是你的断言即将被满足的时候。您尝试访问可能根本没有分配的任意(i,j)。