训练时Creating Layer slice3层报错

框架开发使用jiangwei 回复了问题 • 2 人关注 • 2 个回复 • 82 次浏览 • 2017-06-01 19:58 • 来自相关话题

使caffe支持多lable输入

框架开发使用jiangwei 发表了文章 • 0 个评论 • 99 次浏览 • 2017-06-01 19:17 • 来自相关话题

介绍

ps:文章是从我博客搬过来的,这里的文字排版太麻烦了,如果看着不舒服建议去我博客看(http://www.xjiangwei.cn/2017/05/23/修改caffe源码使其支持多label图片输入/)

修改后的caffe全部源代码在这里(https://github.com/jiangwei199 ... -lable)

caffe可以直接读取原始图片进行训练,但是直接读取图片只支持单label。为进行多label分类训练,需要修改其源代码。这种修改方法相比于网上其他方法修改的是最少的,另外,这样修改也是兼容原来功能的,不影响caffe正常使用。修改如下

主要涉及三个文件

caffe/src/caffe/proto/caffe.proto

caffe/include/caffe/layers/image_data_layer.hpp

caffe/src/caffe/layers/image_data_layer.cpp

修改caffe.protp

定位到caffe/src/caffe/proto/caffe.proto中message ImageDataParameter
// 添加一个参数  
// Specify the label dim. default 1.  
// 有几种label,比如性别、年龄两种label,在网络结构里就把此参数设置为2  
optional uint32 label_dim = IDNumber [default = 1]; 
// IDNumber是和其它参数不冲突的ID数字修改image_data_layer.hpp

定位到caffe/include/caffe/layers/image_data_layer.hpp
// 修改vector<std::pair<std::string, int> > lines_;  
// string对应那个train.txt中的图片名称,in对应label,我们把int改为int*,实现多label  vector<std::pair<std::string, int *> > lines_;修改image_data_layer.cpp

定位到caffe/src/caffe/layers/image_data_layer.cpp
// DataLayerSetUp函数 
// 原本的加载图片名称和label的代码  
std::ifstream infile(source.c_str()); 
string line; size_t pos; int label; 
while (std::getline(infile, line)) 
{ pos = line.find_last_of(' '); label = atoi(line.substr(pos + 1).c_str()); lines_.push_back(std::make_pair(line.substr(0, pos), label)); } 
// 修改为这样 
std::ifstream infile(source.c_str()); string filename; 
// 获取label的种类  
int label_dim = this->layer_param_.image_data_param().label_dim();
 // 注意这里默认每个label直接以空格隔开,每个图片名称及其label占一行,如果你的格式不同,可自行修改读取方式  
while (infile >> filename) { int* labels = new int[label_dim]; for(int i = 0;i < label_dim;++i){ infile >> labels[i]; } lines_.push_back(std::make_pair(filename, labels)); } // 原本的输出label  
vector<int> label_shape(1, batch_size); top[1]->Reshape(label_shape); for (int i = 0; i < this->prefetch_.size(); ++i) { this->prefetch_[i]->label_.Reshape(label_shape); } 
// 修改为这样  vector<int> label_shape(2); label_shape[0] = batch_size; label_shape[1] = label_dim; top[1]->Reshape(label_shape); 
// label的输出
shape batch_size*label_dim  for (int i = 0; i < this->PREFETCH_COUNT; ++i) { this->prefetch_[i].label_.Reshape(label_shape); } 
// 注意:caffe最新版本prefetch_的结构由之前的Batch<Dtype> prefetch_[PREFETCH_COUNT]; 
// 改为 vector<shared_ptr<Batch<Dtype> > > prefetch_; 由对象数组改为了存放shared指针的vector。 // 所以此处的this->PREFETCH_COUNT改为this->prefetch_.size(); 
// 此处的this->prefetch_[i].label_.Reshape(label_shape); 
// 改为this->prefetch_[i]->label_.Reshape(label_shape);把.改成指针的-> 
// load_batch函数 
// 在函数一开始先获取下label_dim参数 int label_dim = this->layer_param_.image_data_param().label_dim(); 
// 原本的预取label prefetch_label[item_id] = lines_[lines_id_].second;
 // 修改为这样 for(int i = 0;i < label_dim;++i){ 
// lines_[lines_id_].second就是最开始改为的int*,多label  prefetch_label[item_id * label_dim + i] = lines_[lines_id_].second[i]; }完成

然后进入caffe根目录,执行sudo make clean sudo make all -j2如果没出错就没问题了

使用示例train.txt 001.jpg 1 3 2 002.jpg 2 4 7 003.jpg 3 0 9
# trainval.prototxt layer { name: "data" type: "ImageData" top: "data" top: "label" include { phase: TRAIN } transform_param { mirror: true mean_value: 128 mean_value: 128 mean_value: 128 } image_data_param { mirror: true source: "your path/train.txt" root_folder: "your image data path" new_height: xxx new_width: xxx batch_size: 32 shuffle: true #每个epoch都会进行shuffle label_dim: 3 } } layer { name: "slice" type: "Slice" bottom: "label" top: "label_1" top: "label_2" top: "label_3" slice_param { axis: 1 slice_point:1 slice_point:2 #这里有n个label就需要添加n-1个slice_point } } 
参考:caffe实现多label输入(修改源码版)(http://blog.csdn.net/u01301088 ... 098346) 查看全部
介绍

ps:文章是从我博客搬过来的,这里的文字排版太麻烦了,如果看着不舒服建议去我博客看(http://www.xjiangwei.cn/2017/05/23/修改caffe源码使其支持多label图片输入/)

修改后的caffe全部源代码在这里(https://github.com/jiangwei199 ... -lable)

caffe可以直接读取原始图片进行训练,但是直接读取图片只支持单label。为进行多label分类训练,需要修改其源代码。这种修改方法相比于网上其他方法修改的是最少的,另外,这样修改也是兼容原来功能的,不影响caffe正常使用。修改如下

主要涉及三个文件

caffe/src/caffe/proto/caffe.proto

caffe/include/caffe/layers/image_data_layer.hpp

caffe/src/caffe/layers/image_data_layer.cpp

修改caffe.protp

定位到caffe/src/caffe/proto/caffe.proto中message ImageDataParameter
// 添加一个参数  
// Specify the label dim. default 1.  
// 有几种label,比如性别、年龄两种label,在网络结构里就把此参数设置为2  
optional uint32 label_dim = IDNumber [default = 1]; 
// IDNumber是和其它参数不冲突的ID数字修改image_data_layer.hpp

定位到caffe/include/caffe/layers/image_data_layer.hpp
// 修改vector<std::pair<std::string, int> > lines_;  
// string对应那个train.txt中的图片名称,in对应label,我们把int改为int*,实现多label  vector<std::pair<std::string, int *> > lines_;修改image_data_layer.cpp

定位到caffe/src/caffe/layers/image_data_layer.cpp
// DataLayerSetUp函数 
// 原本的加载图片名称和label的代码  
std::ifstream infile(source.c_str()); 
string line; size_t pos; int label; 
while (std::getline(infile, line)) 
{ pos = line.find_last_of(' '); label = atoi(line.substr(pos + 1).c_str()); lines_.push_back(std::make_pair(line.substr(0, pos), label)); } 
// 修改为这样 
std::ifstream infile(source.c_str()); string filename; 
// 获取label的种类  
int label_dim = this->layer_param_.image_data_param().label_dim();
 // 注意这里默认每个label直接以空格隔开,每个图片名称及其label占一行,如果你的格式不同,可自行修改读取方式  
while (infile >> filename) { int* labels = new int[label_dim]; for(int i = 0;i < label_dim;++i){ infile >> labels[i]; } lines_.push_back(std::make_pair(filename, labels)); } // 原本的输出label  
vector<int> label_shape(1, batch_size); top[1]->Reshape(label_shape); for (int i = 0; i < this->prefetch_.size(); ++i) { this->prefetch_[i]->label_.Reshape(label_shape); } 
// 修改为这样  vector<int> label_shape(2); label_shape[0] = batch_size; label_shape[1] = label_dim; top[1]->Reshape(label_shape); 
// label的输出
shape batch_size*label_dim  for (int i = 0; i < this->PREFETCH_COUNT; ++i) { this->prefetch_[i].label_.Reshape(label_shape); } 
// 注意:caffe最新版本prefetch_的结构由之前的Batch<Dtype> prefetch_[PREFETCH_COUNT]; 
// 改为 vector<shared_ptr<Batch<Dtype> > > prefetch_; 由对象数组改为了存放shared指针的vector。 // 所以此处的this->PREFETCH_COUNT改为this->prefetch_.size(); 
// 此处的this->prefetch_[i].label_.Reshape(label_shape); 
// 改为this->prefetch_[i]->label_.Reshape(label_shape);把.改成指针的-> 
// load_batch函数 
// 在函数一开始先获取下label_dim参数 int label_dim = this->layer_param_.image_data_param().label_dim(); 
// 原本的预取label prefetch_label[item_id] = lines_[lines_id_].second;
 // 修改为这样 for(int i = 0;i < label_dim;++i){ 
// lines_[lines_id_].second就是最开始改为的int*,多label  prefetch_label[item_id * label_dim + i] = lines_[lines_id_].second[i]; }完成

然后进入caffe根目录,执行sudo make clean sudo make all -j2如果没出错就没问题了

使用示例train.txt 001.jpg 1 3 2 002.jpg 2 4 7 003.jpg 3 0 9
# trainval.prototxt layer { name: "data" type: "ImageData" top: "data" top: "label" include { phase: TRAIN } transform_param { mirror: true mean_value: 128 mean_value: 128 mean_value: 128 } image_data_param { mirror: true source: "your path/train.txt" root_folder: "your image data path" new_height: xxx new_width: xxx batch_size: 32 shuffle: true #每个epoch都会进行shuffle label_dim: 3 } } layer { name: "slice" type: "Slice" bottom: "label" top: "label_1" top: "label_2" top: "label_3" slice_param { axis: 1 slice_point:1 slice_point:2 #这里有n个label就需要添加n-1个slice_point } } 
参考:caffe实现多label输入(修改源码版)(http://blog.csdn.net/u01301088 ... 098346)

py-faster-rcnn如何恢复训练,没找到solverstate

回复

参数调节深度学习思考者 发起了问题 • 1 人关注 • 0 个回复 • 157 次浏览 • 2017-06-01 15:07 • 来自相关话题

caffe训练时怎么知道模型每层所用时间多少?

综合问题jammieluo 回复了问题 • 2 人关注 • 1 个回复 • 351 次浏览 • 2017-06-01 11:24 • 来自相关话题

大家好,新人一个。。刚开始学caffe,21天实践caffe中的mnist 实验在windows下尝试,出现以下错误

深度学习应用lcyangling 回复了问题 • 5 人关注 • 6 个回复 • 1499 次浏览 • 2017-05-31 21:08 • 来自相关话题

caffe训练模型时loss越来越高

回复

图像分类jiangwei 发起了问题 • 1 人关注 • 0 个回复 • 134 次浏览 • 2017-05-31 20:57 • 来自相关话题

compute_image_mean

回复

深度学习理论roselily 发起了问题 • 1 人关注 • 0 个回复 • 111 次浏览 • 2017-05-31 18:27 • 来自相关话题

<<21天实战caffe>>第16天 MNIST数据可视化show_mnist_data.m出现以下错误

回复

深度学习理论roselily 发起了问题 • 1 人关注 • 0 个回复 • 112 次浏览 • 2017-05-31 13:53 • 来自相关话题

二分类问题用SigmoidCrossEntropyLoss和SoftmaxWithLoss均报错

Caffe开发使用popper0912 回复了问题 • 3 人关注 • 1 个回复 • 750 次浏览 • 2017-05-31 10:07 • 来自相关话题

二分类问题用什么模型?

参数调节popper0912 回复了问题 • 4 人关注 • 2 个回复 • 824 次浏览 • 2017-05-31 10:05 • 来自相关话题

windows下运行 py faster rcnn demo.py

回复

目标识别kkkkkk 发起了问题 • 2 人关注 • 0 个回复 • 129 次浏览 • 2017-05-30 22:05 • 来自相关话题

用Python写的层,调用的时候出现以下错误,是怎么回事呢?如何解决呢?T T

综合问题加油吧少年 回复了问题 • 2 人关注 • 2 个回复 • 734 次浏览 • 2017-05-30 19:45 • 来自相关话题

添加两个新层后训练,在snapshot阶段报segmentation fault

框架开发使用gy_cl 回复了问题 • 2 人关注 • 2 个回复 • 586 次浏览 • 2017-05-30 14:42 • 来自相关话题

清华大学 Visual Analytics Group 提出的CNNVis该怎么用?

图像分类辛淼 回复了问题 • 1 人关注 • 1 个回复 • 164 次浏览 • 2017-05-29 21:11 • 来自相关话题

训练缩减版的VGG-8作为微调材料,读取数据阶段为何频频“迷之卡死”

Caffe开发使用rtft667r5 回复了问题 • 6 人关注 • 6 个回复 • 1131 次浏览 • 2017-05-27 23:03 • 来自相关话题

caffe下自己模型的搭建

Caffe开发使用waiting 发表了文章 • 3 个评论 • 150 次浏览 • 2017-05-27 18:40 • 来自相关话题

论文中有这么一段描述:
Due to the small input size, no spatial pooling or downsampling is performed.
Starting from the first layer, the input image is convolved with 96 filters of size
9 × 9, resulting in a map of size 16 × 16 (to avoid boundary effects) and 96
channels. The 96 channels are then pooled with maxout in group of size g = 2,
resulting in 48 channels.




其中The 96 channels are then pooled with maxout in group of size g = 2,
resulting in 48 channels.对应虚线圆圈中的图本人比较困惑,请问要怎么实现呢?是下图的方法实现吗??





 
 
 
 
 
 
 
 
 
 
 
 
  查看全部
论文中有这么一段描述:
Due to the small input size, no spatial pooling or downsampling is performed.
Starting from the first layer, the input image is convolved with 96 filters of size
9 × 9, resulting in a map of size 16 × 16 (to avoid boundary effects) and 96
channels. The 96 channels are then pooled with maxout in group of size g = 2,
resulting in 48 channels.
图片1.jpg

其中The 96 channels are then pooled with maxout in group of size g = 2,
resulting in 48 channels.对应虚线圆圈中的图本人比较困惑,请问要怎么实现呢?是下图的方法实现吗??
P70527-182534.jpg


 
 
 
 
 
 
 
 
 
 
 
 
 

在Ubuntu14.04下跑FCN模型时,出现以下问题,是由于内存不足引起的吗?还是说其他原因。

回复

语义图像分割NAVY_navy 发起了问题 • 1 人关注 • 0 个回复 • 135 次浏览 • 2017-05-27 16:41 • 来自相关话题

在使用caffe做目标检测与识别时,如何直接计算出mAP值。

Caffe开发使用grubby 回复了问题 • 3 人关注 • 2 个回复 • 332 次浏览 • 2017-05-27 10:52 • 来自相关话题

mean_value的顺序是什么?

框架开发使用wqvbjhc 回复了问题 • 5 人关注 • 3 个回复 • 1107 次浏览 • 2017-05-27 09:55 • 来自相关话题

通过脚本来实现caffe的前向传播以达到提速的效果?

Caffe开发使用wqvbjhc 回复了问题 • 2 人关注 • 2 个回复 • 143 次浏览 • 2017-05-27 09:55 • 来自相关话题