Вес доступа и смещение с nn :: последовательный - PullRequest
1 голос
/ 28 марта 2019

Если я определю std::vector<torch::nn::Linear> linear_layers; и заполню этот вектор некоторыми torch::nn::Linear объектами, тогда я смогу получить доступ к значениям weight и bias с помощью linear_layers[k].weight и linear_layers[k].bias. Та же функция доступна для других типов слоев, например, torch::nn::Conv2d.

Если создать мою сеть, используя nn::sequential, а затем отодвинуть либо Linear, либо Conv2d, я не могу получить доступ к weight и bias напрямую. Теперь мой вопрос: как я могу получить доступ к значениям веса и смещения каждого слоя, когда я использовал nn::sequential?

Спасибо, Afshin

1 Ответ

1 голос
/ 27 июня 2019

Вот душа: [см. Ссылку https://discuss.pytorch.org/t/common-class-of-linear-conv-etc/39987/8]

include

с использованием факела пространства имен;используя факел пространства имен :: nn;

int main () {auto net = Sequential (Conv2d (1 / входные каналы /, 1 / выходные каналы /, 2/ размер ядра /), Conv2d (1, 1, 2));

for (auto& p : net->named_parameters()) {

    NoGradGuard no_grad;

    // Access name.
    std::cout << p.key() << std::endl;

    // Access weigth and bias.
    p.value().zero_(); // set all zero
    std::cout << p.value() << std::endl;
}

return 0;
}

Слои последовательного, имеют следующее соглашение об именах:., Например, см. Вывод консоли

0.weight # name of the layer
(1,1,.,.) = 
  0  0
  0  0
[ Variable[CPUFloatType]{1,1,2,2} ]
0.bias
 0
[ Variable[CPUFloatType]{1} ]
1.weight
(1,1,.,.) = 
  0  0
  0  0
[ Variable[CPUFloatType]{1,1,2,2} ]
1.bias
 0
[ Variable[CPUFloatType]{1} ]
...