【问题标题】:Set neural network initial weight values in C++ torch在 C++ 火炬中设置神经网络初始权重值
【发布时间】:2019-06-16 11:03:56
【问题描述】:

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

谢谢, 阿夫辛

【问题讨论】:

    标签: torch libtorch


    【解决方案1】:

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

    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 对象,它的所有层都聚集在一个列表中,命名为“层”。

    【讨论】:

      【解决方案2】:

      我得到的这个解决方案比上一个解决方案更好,其中modeltorch::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);
      }
      

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

      【讨论】:

        猜你喜欢
        • 2021-06-25
        • 2011-12-09
        • 2020-02-08
        • 2021-07-08
        • 2019-10-09
        • 2015-09-06
        • 2019-04-10
        • 1970-01-01
        • 2017-12-06
        相关资源
        最近更新 更多