Обновите значения веса с заданным std::vector

Мне нужно асинхронно обновлять веса нескольких копий одной сети в большинстве алгоритмов 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;
    }
}

в котором weights это std::vector<float>, а также slice Функция возвращает правильный кусок weights вектор.

Спасибо афшин

0 ответов

Другие вопросы по тегам