动态特征矩阵随机初始化
Dynamic Eigen Matrix Random Initialization
我有一个名为权重的向量。在循环中,分配了一个新的 MatrixXf,将指针推送到向量,并打算将其初始化为随机值。但是,我想避免使用 setRandom() 来支持我的 He 分布。
下面未注释的代码按原样工作,但创建一个可能在堆栈(或堆,但 class 文档含糊)中的 'local' 矩阵感觉非常笨重,并且将其复制到我的目标矩阵中。注释行是我之前尝试过但没有效果的东西(矩阵值保持为 0)。
更好的解决方案是什么?
/* context */
typedef Eigen::MatrixXf Matrix;
vector<Matrix*> weights;
random_device rd;
mt19937 rgen(rd());
...
// Initialize weights (using He)
if (i > 0) {
uint p = neurons[i-1]->size();
uint c = neurons[i]->size();
normal_distribution<float> dist(0.0, sqrt(2.0/p));
auto he = [&](){return dist(rgen);};
// This is what feels clunky
Matrix m = Eigen::MatrixXf::NullaryExpr(c, p, he);
weights.push_back(new Matrix(c, p));
(*weights.back()) = m;
// This is what I tried before
//weights.back()->NullaryExpr(weights.back()->rows(), weights.back()->cols(), he);
//weights.back()->NullaryExpr([&](){return dist(rgen);});
}
您可以使用共享指针向量:
#include <memory>
...
vector<shared_ptr<Matrix>> weights;
...
Matrix m = Eigen::MatrixXf::NullaryExpr(c, p, he);
weights.push_back(make_shared<Matrix>(m));
也许有人会批评这种方法是语法糖,它在原始“笨拙”版本的内部工作方式上没有太大变化。但它避免了使用 new
和随后使用 *weights.back()
.
复制内容的需要
当然这也可以写成一行:
weights.push_back(make_shared<Matrix>(Matrix::NullaryExpr(c, p, he)));
我有一个名为权重的向量
下面未注释的代码按原样工作,但创建一个可能在堆栈(或堆,但 class 文档含糊)中的 'local' 矩阵感觉非常笨重,并且将其复制到我的目标矩阵中。注释行是我之前尝试过但没有效果的东西(矩阵值保持为 0)。
更好的解决方案是什么?
/* context */
typedef Eigen::MatrixXf Matrix;
vector<Matrix*> weights;
random_device rd;
mt19937 rgen(rd());
...
// Initialize weights (using He)
if (i > 0) {
uint p = neurons[i-1]->size();
uint c = neurons[i]->size();
normal_distribution<float> dist(0.0, sqrt(2.0/p));
auto he = [&](){return dist(rgen);};
// This is what feels clunky
Matrix m = Eigen::MatrixXf::NullaryExpr(c, p, he);
weights.push_back(new Matrix(c, p));
(*weights.back()) = m;
// This is what I tried before
//weights.back()->NullaryExpr(weights.back()->rows(), weights.back()->cols(), he);
//weights.back()->NullaryExpr([&](){return dist(rgen);});
}
您可以使用共享指针向量:
#include <memory>
...
vector<shared_ptr<Matrix>> weights;
...
Matrix m = Eigen::MatrixXf::NullaryExpr(c, p, he);
weights.push_back(make_shared<Matrix>(m));
也许有人会批评这种方法是语法糖,它在原始“笨拙”版本的内部工作方式上没有太大变化。但它避免了使用 new
和随后使用 *weights.back()
.
当然这也可以写成一行:
weights.push_back(make_shared<Matrix>(Matrix::NullaryExpr(c, p, he)));