代码先锋网 代码片段及技术文章聚合

Caffe Python MemoryDataLayer Segmentation Fault

转载请注明出处,楼燚(yì)航的blog,http://home.cnblogs.com/louyihang-loves-baiyan/

因为利用Pyhon来做数据的预处理比较方便,因此在data_layer选择上,采用了MemoryDataLayer,可以比较方便的直接用Python 根据set_input_array进行feed数据,然后再调用solver进行step就可以了。说一下我碰到的问题,当时检查了一下感觉没有哪里出错,但是报

Segmentation Fault(Core Abort)

感觉好囧,最怕这个了。一般说段错误都是内存错误,比如数组越界,无效的指针,引用被释放的资源等等。经过一步步debug之后发现问题出现在

solver.net.set_input_arrays

solver在将数据传送到网络低端的时候报错。那么接下来找到python目录下的caffe\python\caffe\_caffe.cpp文件,这个文件是基于boost python的,用来将C++的接口导出,供python调用。进一步我们找到相关函数

void Net_SetInputArrays(Net<Dtype>* net, bp::object data_obj,
    bp::object labels_obj) {
  // check that this network has an input MemoryDataLayer
  shared_ptr<MemoryDataLayer<Dtype> > md_layer =
    boost::dynamic_pointer_cast<MemoryDataLayer<Dtype> >(net->layers()[0]);
  if (!md_layer) {
    throw std::runtime_error("set_input_arrays may only be called if the"
        " first layer is a MemoryDataLayer");
  }
  // check that we were passed appropriately-sized contiguous memory
  PyArrayObject* data_arr =
      reinterpret_cast<PyArrayObject*>(data_obj.ptr());
  PyArrayObject* labels_arr =
      reinterpret_cast<PyArrayObject*>(labels_obj.ptr());
  CheckContiguousArray(data_arr, "data array", md_layer->channels(),
      md_layer->height(), md_layer->width());
  CheckContiguousArray(labels_arr, "labels array", 1, 1, 1);
  if (PyArray_DIMS(data_arr)[0] != PyArray_DIMS(labels_arr)[0]) {
    throw std::runtime_error("data and labels must have the same first"
        " dimension");
  }
  if (PyArray_DIMS(data_arr)[0] % md_layer->batch_size() != 0) {
    throw std::runtime_error("first dimensions of input arrays must be a"
        " multiple of batch size");
  }
  md_layer->Reset(static_cast<Dtype*>(PyArray_DATA(data_arr)),
      static_cast<Dtype*>(PyArray_DATA(labels_arr)),
      PyArray_DIMS(data_arr)[0]);
}

问题就出在了最后的一个语句

 md_layer->Reset(static_cast<Dtype*>(PyArray_DATA(data_arr)),
      static_cast<Dtype*>(PyArray_DATA(labels_arr)),
      PyArray_DIMS(data_arr)[0]);

当执行reset MemoryDataLayer的Reset函数时出错。于此同时在github上也发现了同样的问题,https://github.com/BVLC/caffe/issues/2334也是因为Python MemoryDataLayer引发的段错误。他说到,在里面把传入的data和label做要给深拷贝就可以解决,估计是运行时数据已经被释放了,只传了指针引发了段错误。

解决方案:
找到caffe\src\layers\memory_data_layer.cpp打开,给Reset函数添加相应的深拷贝代码

template <typename Dtype>
void MemoryDataLayer<Dtype>::Reset(Dtype* data, Dtype* labels, int n) {
  CHECK(data);
  CHECK(labels);
  CHECK_EQ(n % batch_size_, 0) << "n must be a multiple of batch size";
  // Warn with transformation parameters since a memory array is meant to
  // be generic and no transformations are done with Reset().
  if (this->layer_param_.has_transform_param()) {
    LOG(WARNING) << this->type() << " does not transform array data on Reset()";
  }
  // data_ = data; 将这里注释掉,
  // labels_ = labels;

  //以下部分是进行深拷贝
  if(data_)
      delete []data_;
  if(labels_)
      delete [] labels_;
  data_ = new Dtype[n*size_];
  labels_ = new Dtype[n * num_tasks_];

  memcpy(data_, data, sizeof(Dtype)*n*size_);
  memcpy(labels_, labels, sizeof(Dtype) * n * num_tasks_);

  n_ = n;
  pos_ = 0;
}

Ok进行修改之后,回到Caffe的根目录,执行make all,make test,`make runtest,make pycaffe。重新编译完成之后,重新运行就好了,继续开始训练。

版权声明:本文为weixin_30808253原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30808253/article/details/99617450

智能推荐

运行python代码,报错 “segmentation fault”

问题 执行运行python文件命令: 报错: [1] 57684 segmentation fault 解决 具体原因我不确定。我是在电脑本地运行的,没有连接服务器,搜资料有说是内存不够了,但是我删了很多进程,依然不好使。 最后我重新搭建了一个conda虚拟环境,到新环境中就不报错了。 所以现在个人角度是怀疑之前的环境有所损坏。...

gdb调试python的segmentation fault错误

目录 方法1:gdb调试 方法2:使用faulthandler 调试 方法1:gdb调试 方法2:使用faulthandler 调试  在代码中加入 然后通过python3 -Xfaulthandler xx.py 执行. 打印挂掉时的堆栈...

python错误提示:segmentation fault (core dumped)

错误提示:segmentation fault (core dumped) 场景: 1、重装 tensorflow-gpu 后; 2、python中 import tensorflow 报错。 解决方法: 安装更高版本的 tensorflow-gpu,我的报错版本为1.13.2,卸载后安装1.14.0,问题解决。 查询 tensorflow 版本:...

Debug python - Segmentation fault (core dumped)

现象: Pytorch代码,之前可以训练,突然出现了Segmentation fault (core dumped)错误,啥也跑不了 调试: 运行的时候,加上 解决: 可以发现问题引起的代码 所以问题出在该环境既有torch又有tensorflow,导致了奇怪的问题,该环境下卸载tensorflow-gpu,问题解决...

segmentation fault分析方法

相信写c/c++程序的coder, segmentation fault的问题碰到不少,趁最近有时间总结一下分析此类错误的方法。 1. 段错误是什么 一句话来说,段错误是指访问的内存超出了系统给这个程序所设定的内存空间,例如访问了不存在的内存地址、访问了系统保护的内存地址、访问了只读的内存地址等等情况。这里贴一个对于“段错误”的准确定义(https://en.wikiped...

猜你喜欢

php出现Segmentation fault

发现 Segmentation fault 今天安装了 xdebug、xhrpof等分析工具, 然后在运行相关命令时出现了 Segmentation fault(分段错误), 一般出现此错误大部分 内存越界指针错误引起的原因, 并非 php 代码本身原因. 出现此问题大部分因为底层拓展导致。 示例: 生成core dump 这种错误信息, 借助 core.dump 文件分析是种比较好的办法 默认文...

Segmentation fault (core dumped)

Segmentation fault (core dumped)  $/test/src/$ gcc -o app reverse.c -g $/test/src/$ ./app Enter 3 number :12 13 14 Segmentation fault (core dumped)...

Segmentation fault (core dumped)

以下程序不小心在11行scanf()中把parr写成了*parr,在编译时没问题,但在运行时出现: [lujinhong@lujinhong chapter12]$ gcc reverse3.c [lujinhong@lujinhong chapter12]$ ./a.out Enter 10  number: 19 76 8 93 766 8 6 934 0 -3 Segmentati...

Segmentation fault (core dumped)

以下程序不小心在11行scanf()中把parr写成了*parr,在编译时没问题,但在运行时出现: [lujinhong@lujinhong chapter12]$ gcc reverse3.c [lujinhong@lujinhong chapter12]$ ./a.out Enter 10  number: 19 76 8 93 766 8 6 934 0 -3 Segmentati...

bug: Segmentation fault

Segmentation fault; possible reasons:     What is a segmentation fault? Ask Question Asked 9 years, 5 months ago Active 5 months ago Viewed 524k times   514   247 Wh...