在C ++火炬中设置神经网络初始权重值

时间:2019-01-22 22:27:50

标签: torch libtorch

我正在寻找一个API,以在libtorch中设置初始重量值。在python版本中,(即pytorch)可以轻松使用torch.nn.functional.weight.data.fill_(xx)torch.nn.functional.bias.data.fill_(xx)。但是,似乎这样的API在C ++中尚不存在。 我将不胜感激,以帮助或评论实现这种功能。

谢谢, 苦参碱

2 个答案:

答案 0 :(得分: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对象,其所有层都收集在一个名为“ layers”的列表中。

答案 1 :(得分:0)

我得到的解决方案比以前的解决方案更好,在该解决方案中,valuemodel类型的对象:

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_层,并且可以用于任何层类型。

相关问题