动态特征矩阵随机初始化



我有一个vector<MatrixXf*>所谓的权重。在循环中,分配一个新的MatrixXf,将指针压入vector,并将其初始化为随机值。但是,我想避免使用setRandom()来支持我的He发行版。

下面的未注释代码按原样工作,但是创建一个可能在堆栈(或堆,但类文档是模糊的)中的"本地"矩阵并将其复制到我的目标矩阵中感觉非常笨拙。注释行是我之前尝试过的没有效果的东西(矩阵值保持为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);});
    }

可以使用共享指针的vector:

#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)));

最新更新