1

我正在寻找一个 API 来在 libtorch 中设置初始权重值。在 python 版本中,(即pytorch)可以很容易地使用torch.nn.functional.weight.data.fill_(xx)torch.nn.functional.bias.data.fill_(xx)。但是,在 C++ 中似乎还没有这样的 API。对于实现此类功能的任何帮助或评论,我将不胜感激。

谢谢, 阿夫辛

4

2 回答 2

0

我开发了这个功能来做到这一点:

void set_weights(fc_model &src_net) {

//    torch::NoGradGuard no_grad;
    torch::autograd::GradMode::set_enabled(false);
    for (int k=0; k < src_net.no_layers-1; k++ ) {
        src_net.layers[k]->weight.uniform_(0.001, 0.001);
        src_net.layers[k]->bias.uniform_(0.0, 0.0);
    }
    torch::autograd::GradMode::set_enabled(true);
}

其中src_net是一个nn对象,它的所有层都收集在一个列表中,名称为“层”。

于 2019-02-26T20:09:04.927 回答
0

我得到的这个解决方案比前一个解决方案更好,其中model是一个类型的对象torch::nn::Sequential

torch::NoGradGuard no_grad;

for (auto &p : model->named_parameters()) {
    std::string y = p.key();
    auto z = p.value(); // note that z is a Tensor, same as &p : layers->parameters

    if (y.compare(2, 6, "weight") == 0)
        z.uniform_(l, u);
    else if (y.compare(2, 4, "bias") == 0)
        z.uniform_(l, u);
}

而不是uniform_你可以使用normal_, ... ,它们在手电筒上可用。此解决方案不限于torch::nn::Linear层,可用于任何层类型。

于 2020-11-18T13:58:53.280 回答