【问题标题】:Implementation of ReLU function on C++ReLU函数在C++上的实现
【发布时间】: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)

标签: c++ relu


【解决方案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());
}

【讨论】:

  • 是的,这正是我所做的,但结果不是我所期望的。我有一个成本 = nan //
  • 这不是你的例子所说的。显示产生上述消息的正确代码。否则,请使用其他描述打开另一个问题。
  • 我同意你的观点,初始化矩阵帮助我解决了我的问题。
【解决方案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

【讨论】:

  • 谢谢!我没看到。谢谢,我会改正的。
  • 如果有帮助很高兴
猜你喜欢
  • 2015-11-13
  • 2018-03-06
  • 2018-11-04
  • 2018-06-14
  • 2019-07-24
  • 2018-11-08
  • 1970-01-01
  • 2020-05-02
  • 1970-01-01
相关资源
最近更新 更多