CNN 的 tanh() 激活函数的实现
Implementation of tanh() activation function for a CNN
我试图在我的 CNN 上实现激活函数 tanh,但它不起作用,结果总是 "NaN"。所以我创建了一个简单的应用程序,其中我有一个随机矩阵并尝试应用 tanh(x) 函数从而了解问题出在哪里?
这是我的实现:
Eigen::MatrixXd A = Eigen::MatrixXd::Random(10,1000);
Eigen::MatrixXd result, deriv;
result = A.array().tanh();
deriv = 1.0 - result*result;
唯一的结果就是这个错误:
no match for ‘operator-’ (operand types are ‘double’ and ‘const Eigen::Product<Eigen::Matrix<double, -1, -1>, Eigen::Matrix<double, -1, -1>, 0>’)
deriv = (1.0 - result*result );
~~~~^~~~~~~~~~~~~~~
你能帮帮我吗?
乘积 result*result
的维数不适合矩阵乘法。我们可以使用 result*result.transpose()
代替(除非打算进行系数乘法,在这种情况下可以使用 result.array()*result.array()
)。
要从全为 1 的矩阵中减去结果矩阵的值,可以使用 .array()
方法:
deriv = 1. - (result*result.transpose()).array();
我使用 openCV 创建了一个矩阵
像这样:
cv::Mat sum;
Eigen::MatrixXd SUM, Acv;
cv::eigen2cv(A,Acv)
sum=Mat::ones(Acv.rows,Acv.cols, CV_32FC1);
cv::cv2eigen(sum,SUM);
所以 :
deriv = SUM - result*result;
现在,这是另一个问题:(
/usr/include/eigen3/Eigen/src/Core/CwiseBinaryOp.h :110 : Eigen::CwiseBinaryOp<BinaryOp, Lhs, Rhs>::CwiseBinaryOp(const Lhs&, const Rhs&, const BinaryOp&) [with BinaryOp = Eigen::internal::scalar_difference_op<double, double>; LhsType = const Eigen::Matrix<double, -1, -1>; RhsType = const Eigen::Product<Eigen::Matrix<double, -1, -1>, Eigen::Matrix<double, -1, -1>, 0>; Eigen::CwiseBinaryOp<BinaryOp, Lhs, Rhs>::Lhs = Eigen::Matrix<double, -1, -1>; Eigen::CwiseBinaryOp<BinaryOp, Lhs, Rhs>::Rhs = Eigen::Product<Eigen::Matrix<double, -1, -1>, Eigen::Matrix<double, -1, -1>, 0>]: l'assertion « aLhs.rows() == aRhs.rows() && aLhs.cols() == aRhs.cols() » a échoué.
我试图在我的 CNN 上实现激活函数 tanh,但它不起作用,结果总是 "NaN"。所以我创建了一个简单的应用程序,其中我有一个随机矩阵并尝试应用 tanh(x) 函数从而了解问题出在哪里?
这是我的实现:
Eigen::MatrixXd A = Eigen::MatrixXd::Random(10,1000);
Eigen::MatrixXd result, deriv;
result = A.array().tanh();
deriv = 1.0 - result*result;
唯一的结果就是这个错误:
no match for ‘operator-’ (operand types are ‘double’ and ‘const Eigen::Product<Eigen::Matrix<double, -1, -1>, Eigen::Matrix<double, -1, -1>, 0>’)
deriv = (1.0 - result*result );
~~~~^~~~~~~~~~~~~~~
你能帮帮我吗?
乘积 result*result
的维数不适合矩阵乘法。我们可以使用 result*result.transpose()
代替(除非打算进行系数乘法,在这种情况下可以使用 result.array()*result.array()
)。
要从全为 1 的矩阵中减去结果矩阵的值,可以使用 .array()
方法:
deriv = 1. - (result*result.transpose()).array();
我使用 openCV 创建了一个矩阵 像这样:
cv::Mat sum;
Eigen::MatrixXd SUM, Acv;
cv::eigen2cv(A,Acv)
sum=Mat::ones(Acv.rows,Acv.cols, CV_32FC1);
cv::cv2eigen(sum,SUM);
所以 :
deriv = SUM - result*result;
现在,这是另一个问题:(
/usr/include/eigen3/Eigen/src/Core/CwiseBinaryOp.h :110 : Eigen::CwiseBinaryOp<BinaryOp, Lhs, Rhs>::CwiseBinaryOp(const Lhs&, const Rhs&, const BinaryOp&) [with BinaryOp = Eigen::internal::scalar_difference_op<double, double>; LhsType = const Eigen::Matrix<double, -1, -1>; RhsType = const Eigen::Product<Eigen::Matrix<double, -1, -1>, Eigen::Matrix<double, -1, -1>, 0>; Eigen::CwiseBinaryOp<BinaryOp, Lhs, Rhs>::Lhs = Eigen::Matrix<double, -1, -1>; Eigen::CwiseBinaryOp<BinaryOp, Lhs, Rhs>::Rhs = Eigen::Product<Eigen::Matrix<double, -1, -1>, Eigen::Matrix<double, -1, -1>, 0>]: l'assertion « aLhs.rows() == aRhs.rows() && aLhs.cols() == aRhs.cols() » a échoué.