caffe error == cudaSuccess (77 против 0) был встречен незаконный доступ к памяти

Недавно мне нужно изменить код softmax_loss_layer в caffe. Версия для caffe: https://github.com/BVLC/caffe

Код между... является моим кодом, а остальное - тем же. Вот как я изменил код. Сначала я добавил rs_ в loss_layers.hpp

class SoftmaxWithLossLayer : public LossLayer<Dtype> {
...
Blob<Dtype> rs_;
...
}

Затем я изменяю rs_ в softmax_loss_layer.cpp

void SoftmaxWithLossLayer<Dtype>::LayerSetUp(
const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) {
...
rs_.Reshape(bottom[2]->num(),bottom[2]->channels(),bottom[2]->height(),
bottom[2]->width());
}

Bottom [2] - от dense_image_data_layer.cpp

template <typename Dtype>
void DenseImageDataLayer<Dtype>::DataLayerSetUp(constvector<Blob<Dtype>*>& bottom,
  const vector<Blob<Dtype>*>& top) {
top[2]->Reshape(batch_size, 1, height, width);
this->prefetch_weight_.Reshape(batch_size, 1, height, width);
this->transformed_weight_.Reshape(1, 1, height, width);
}
Dtype* top_data = top[2]->mutable_cpu_data();
const int count = top[2]->count();
if(crop_size > 0) {
for(int index = 0;index < count;++index)
{
const int ww = index % crop_size;
const int wh = (index / crop_size) % crop_size;
top_data[index]=static_cast<Dtype>(cv_weight.at<uchar>(wh,ww));
}
}
else{
for(int index = 0;index < count;++index)
{
const int ww = index % width;
const int wh = (index / width) % height;
top_data[index]=static_cast<Dtype>(cv_weight.at<uchar>(wh,ww));
}
}

Наконец, я добавил этот код в softmax_loss_layer.cu

template <typename Dtype>
void SoftmaxWithLossLayer<Dtype>::Forward_gpu(
const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) {
...
Dtype loss;
Dtype em;
bool add_weight=this->layer_param_.loss_param().add_weight();
Dtype* weight=bottom[2]->mutable_gpu_data();
Dtype z=0;
Dtype* rs=rs_.mutable_gpu_data();
if(add_weight)
{
SoftmaxLossWeightForwardGPU<Dtype><<<CAFFE_GET_BLOCKS(nthreads),
  CAFFE_CUDA_NUM_THREADS>>>(nthreads, prob_data, label, 
  weight_by_label_freqs_, label_count_data , loss_data, 
  outer_num_, dim, inner_num_, 
  has_ignore_label_, ignore_label_, counts,weight,rs);
const Dtype*rs1=rs_.gpu_data();
caffe_gpu_asum(nthreads, loss_data, &loss);
em=loss/nthreads;
count=nthreads;
Dtype am=1/2*log((1-em)/em);
CalculateZ<Dtype><<<CAFFE_GET_BLOCKS(nthreads),
CAFFE_CUDA_NUM_THREADS>>>(nthreads,weight,rs1,am,z,inner_num_);
WeightUpdate<Dtype><<<CAFFE_GET_BLOCKS(nthreads),
  CAFFE_CUDA_NUM_THREADS>>>(nthreads,weight,rs1,am,z,inner_num_);
...
}

template <typename Dtype>
void SoftmaxWithLossLayer<Dtype>::Backward_gpu(const    vector<Blob<Dtype>*>& top,const vector<bool>& propagate_down, const  vector<Blob<Dtype>*>& bottom) {
...
const Dtype* weight=bottom[2]->gpu_data();
bool add_weight=this->layer_param_.loss_param().add_weight();
if(add_weight)
SoftmaxLossWeightBackwardGPU<Dtype><<<CAFFE_GET_BLOCKS(nthreads),
    CAFFE_CUDA_NUM_THREADS>>>(nthreads, top_data, label,
    weight_by_label_freqs_, label_count_data, bottom_diff, 
    outer_num_, dim, inner_num_, has_ignore_label_, 
    ignore_label_, counts,weight);
...
}

Ошибка:

F0108 10:45:48.291290  2859 math_functions.cu:81] Check failed: error ==     cudaSuccess (77 vs. 0)  an illegal memory access was encountered
*** Check failure stack trace: ***
@     0x7f0b3bcfbdaa  (unknown)
@     0x7f0b3bcfbce4  (unknown)
@     0x7f0b3bcfb6e6  (unknown)
@     0x7f0b3bcfe687  (unknown)
@     0x7f0b3c16dd48  caffe::caffe_gpu_memcpy()
@     0x7f0b3c09b67e  caffe::SyncedMemory::gpu_data()
@     0x7f0b3c054472  caffe::Blob<>::gpu_data()
@     0x7f0b3c0b0568  caffe::Net<>::ForwardFromTo()
@     0x7f0b3c0b0947  caffe::Net<>::ForwardPrefilled()
@     0x7f0b3c08e555  caffe::Solver<>::Step()
@     0x7f0b3c08ee8f  caffe::Solver<>::Solve()
@           0x407806  train()
@           0x405d41  main
@     0x7f0b3b20dec5  (unknown)
@           0x4062ed  (unknown)
@              (nil)  (unknown)

Я думаю, что эта ошибка связана с тем, что я не использовал rs_ правильно или нижний [2] не прав. Весь код, который я изменил, размещен выше, так может кто-нибудь сказать мне, что делать? Если вам нужна дополнительная информация, пожалуйста, скажите мне?

-1
источник поделиться
1 ответ

Трудно следить за вашим кодом и изменениями.
Некоторые комментарии;

  1. reshape ИНГ rs_ должно происходить в reshape() метод, а не в setup().
  2. Лучше всего использовать rs_.ReshapeLike(*bottom[2]) чем явно перечислять num, channels и т.д. Что делать, если у вас будет Blob с различным количеством измерений?
  3. Вы проверили свой измененный слой? Из caffe wiki:

    Напишите тесты в test/test_your_layer.cpp. Используйте test/test_gradient_check_util.hpp чтобы проверить, что ваши передовые и обратные реализации находятся в числовом соглашении.

+1
источник

Посмотрите другие вопросы по меткам или Задайте вопрос