caffe中mirror(镜像)参数的作用
按照caffe官方说明确实是数据增强的一种方式。 (通过水平方向调换图像)
但是在我理解 数据增强应该是利用现有数据增加训练数据集,就是训练时既有原来未mirror的图像,在加上mirror后的图像。 mirror机制使得数据样本double。
It is random left-right flipping, a common operating when training models. Please ask questions on the mailing list
另外代码也有讲:
if (mirror && rand() % 2) {} //有随机判断
caffe训练参数设置
一般偏置项的学习率是权值学习率的两倍。
weight_filler: 权值初始化。 默认为“constant",值全为0,很多时候我们用"xavier"算法来进行初始化,也可以设置为”gaussian"
# ./build/tools/caffe time -model examples/mnist/lenet_train_test.prototxt -gpu 0
这个例子用来在屏幕上显示lenet模型用gpu迭代50次所使用的时间。默认50次
linux下,本身就有一个time命令,因此可以结合进来使用,因此我们运行mnist例子的最终命令是(一块gpu):
$ sudo time ./build/toos/caffe train -solver examples/mnist/lenet_solver.prototxt
caffe 的layer的参数说明
Caffe中deploy.prototxt 和 train_val.prototxt 区别
caffe HDF5Data 层使用及数据生成
在定义.proto文件里的data层时注意,hdf5_data_param的source不要直接写我们生成的HDF5文件的路径,而是写一个.txt文件的,并在.txt文件里写入你生成的HDF5文件的路经,一个HDF5文件路径占一行,一定要这样哦。原因是因为,我们可以要读入多个HDF5文件,所以要这样写哦。
需要注意的是Caffe中HDF的DataLayer不支持transform,所以数据存储前就提前进行了减去均值的步骤。
相关python代码解释
1.定义搜索优先顺序
1. import sys
2. sys.path.insert(1, "./model")
sys.path.insert(1, "./crnn")定义搜索路径的优先顺序,序号从0开始,表示最大优先级,sys.path.insert()加入的也是临时搜索路径,程序退出后失效。
EuclideanLossLayer
假如label是h*w
的分辨率,最后用caffe的EuclideanLossLayer计算的loss值是h*w
个loss(label和网络预测逐像素)的总和。
没有除以h*w,只除了batch size。见源码:
template <typename Dtype>
void EuclideanLossLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom,
const vector<Blob<Dtype>*>& top) {
int count = bottom[0]->count(); //这里的count就是你的batchsize的大小
caffe_gpu_sub(
count,
bottom[0]->gpu_data(), //网络的输出值
bottom[1]->gpu_data(), //标签值
diff_.mutable_gpu_data());//存储bottom[0] - bottom[1]
Dtype dot;
caffe_gpu_dot(count, diff_.gpu_data(), diff_.gpu_data(), &dot);//做点乘运算
Dtype loss = dot / bottom[0]->num() / Dtype(2); //除以总数再除以2
top[0]->mutable_cpu_data()[0] = loss; //将loss值赋给输出
}
网络文件
以CaffeNet为例:
- train_val.prototxt
首先,train_val.prototxt文件是网络配置文件。该文件是在训练的时候用的。
2.deploy.prototxt
该文件是在测试时使用的文件。
例子
matlab使用imagesc
函数观察图像