我正在尝试手动访问 blob 值并对其进行更改。
我有一个名为“1conv1_w”的 blob,我通过以下方式访问它:
auto 1conv1_w = caffe2::TensorCPU((*workspace.GetBlob("1conv1_w")).Get<caffe2::TensorCPU>()).data<float>();
这将返回一个指向float*
1conv1_w 的指针。在 CPU 模式下,我可以使用
std::cout << *1conv1_w << std::endl
访问 Blob "1conv1_w" 中的第一个值以及修改该值。但是,当进入 GPU 模式时,这将返回错误,因为指针中没有值。如果我使用
auto 1conv1_w = caffe2::TensorCPU((*workspace.GetBlob("1conv1_w")).Get<caffe2::TensorCUDA>()).data<float>()[0];
然后我可以访问第一个值,但仍然无法访问 blob 中的其他值。
我猜这个问题是因为在使用 GPU 时,内存实际上是一个临时内存。该值在 CPU 和 GPU 之间复制(可能是 memcpy)。当我使用Get<caffe2::TensorCUDA>()
它时,只需将我想要的地址或值复制给我。因此,即使我更改了此地址中的值,它也不会影响保存在某处的实际值。
有没有人面临同样的问题并且知道如何更改 blob 的实际值?