提问人:PengJv Nie 提问时间:5/25/2023 最后编辑:PengJv Nie 更新时间:6/9/2023 访问量:47
为什么在被覆盖的 Solver::Callback::after_step() 中对输入 blob 的梯度扰动会导致输入 blob 发生更改
Why does gradient perturbation to input blob in overrided Solver::Callback::after_step() cause the input blob altered
问:
我正在尝试实现“对抗性数据增强”算法。为此,我注册了一个回调类,该类公开继承自函数和 。功能如下:GradPerturb
caffe::Solver<float>::Callback
GradPerturb::before_step()
GradPerturb::after_step()
after_step()
caffe::Blob<float>* input_blob = solver_.net()->input_blobs()[0];
caffe::Blob<float>* label_blob = solver_.net()->input_blobs()[1];
boost::shared_ptr<caffe::Blob<float>> first_feat = solver_.net()->blob_by_name("conv1_n");
boost::shared_ptr<caffe::Layer<float>> first_layer = solver_.net()->layer_by_name("conv1_n");
std::vector<bool> propagate_down(1, true);
const int input_data_count = input_blob->count();
std::vector<caffe::Blob<float>*> top_vecs(1, first_feat.get());
std::vector<caffe::Blob<float>*> bottom_vecs(1, input_blob);
for (int i = 0; i < perturb_iters_; ++i)
{
caffe::caffe_gpu_set(first_feat->count(), 1.f, first_feat->mutable_gpu_diff());
float loss = solver_.net()->ForwardBackward();
first_layer->Backward(top_vecs, propagate_down, bottom_vecs);
caffe::caffe_gpu_axpy(input_data_count, perturb_scale_, input_blob->gpu_diff(), input_blob->mutable_gpu_data());
solver_.net()->ClearParamDiffs();
}
但是调用后,数据发生了变化。我的意思是它与以前不是同一批图像。caffe_gpu_axpy
input_blob
我尝试打印指针,它从未改变。另外,我尝试调用对应的 cpu 版本,甚至在 for 循环中计算,如下所示:input_blob
caffe_axpy
for (int j = 0; j < input_data_count; ++j)
{
input_blob->mutable_cpu_data()[j] = input_blob->cpu_diff()[j] * perturb_scale_ + input_blob->cpu_data()[j];
}
更令人惊讶的是,数据输入没有改变,但标签在前几次迭代后发生了变化。事实上,当梯度扰动被移动到 时,这种现象并没有发生。所以我猜是 caffe 中的机制或多线程导致的,但我不明白实际的机制。input_blob
label_blob
before_step()
Solver::Callback
答: 暂无答案
评论