使用给定的std :: vector更新权重值

时间:2019-05-06 14:32:36

标签: libtorch

在大多数RL算法中,我需要异步更新一个网络的多个副本的权重。我试图编写一个类函数,其中存在一个toch::nn::seqential的实例。 使用named_parameters(),我可以访问网络中的参数。现在,问题是我可以将另一个具有相同形状的张量分配给p.value()吗? 例如,假设我有张量w,其特征与p.value()相同。 p.value() = w是否将w中的值分配给p.value()? 我按照以下步骤测试了此过程,但它对我不起作用:

torch::autograd::GradMode::set_enabled(false);
int m=0;
for (auto &p : net->named_parameters()) {
    auto z = p.value(); // note that z is a Tensor, same as &p : net->parameters
    auto w = torch::zeros_like(p.value());
    if (z.dim()==1){
        int first =  m;
        int last = m + z.size(0);
        m += z.size(0);
        auto v = slice(weights, first, last);
        w+= torch::tensor(v);//.to(cpu_device);
        p.value() = w;
    }
    else if (z.dim()==2){
        int first = m;
        int last = m + z.size(0)*z.size(1);
        m += z.size(0)*z.size(1);
        auto v = slice(weights, first, last);
        w += torch::reshape(torch::tensor(v), {z.size(0),z.size(1)});//.to(cpu_device);
        p.value() = w;
    }
}

其中weightsstd::vector<float>,而slice函数返回weights向量的适当切片。

谢谢, 苦参碱

0 个答案:

没有答案