caffe训练常见错误:

更多错误参见:
http://www.cnblogs.com/maohai/p/6453417.html

1.训练结果accuracy一直为零,loss一直为87.3365

这里写图片描述
1)标签问题:图像分类的标签要从0开始;
2)网络最后一层的num_output值要和标签的值域一致(表示分类个数)
3)bacth_size改大(保证一次测试(验证),batch_size*test_iter>=测试集图片数)
4)尽量使测试集,验证集,训练集互斥
5)学习率调小
注:后三条可针对accuracy=1,loss=0的情况;
调小学习率后,又出现验证集loss在8-10左右不收敛,训练集正常:

2.训练命令报错:找不到路径

这里写图片描述
检查图片路径是否正确,要保证下图中图片路径+txt文本中路径(拼接)是图片的完整路径:
这里写图片描述

3.网络可视化在线网址

http://blog.csdn.net/solomon1558/article/details/53144606

4.caffe绘制训练过程的loss和accuracy曲线

http://www.cnblogs.com/Allen-rg/p/5822332.html

5.caffe训练后,如何进行测试

https://www.zhihu.com/question/44545002

caffe/build/tools/caffe test -model=/to/your/path/test_prototxt -weights=/to/your/path/model.caffemodel -iterations=n -gpu 0

其中iterations为迭代次数,默认50次
实例:mnist数据集训练完毕后,得到lenet_iter_10000.caffemodel,如想在测试集上测试,只需要将lenet_train_test.prototxt中验证集路径改为测试集路径即可:
这里写图片描述
由于测试batch_size为100,迭代次数为100,这样就可以测试完10000张图片,结果如下:
这里写图片描述

6.(1)对训练模型测试一张图片(c++接口)

http://blog.csdn.net/jiongnima/article/details/52681816
按照上面的链接中博客将测试所需的五个要素准备好后,就是用下面的命令调用caffe自带的c++接口的分类器分类了:

./build/examples/cpp_classification/classification.bin /home/hsm/project/facialexpress/convnet1/deploy.prototxt /home/hsm/project/facialexpress/convnet1/train_info2/_iter_10000.caffemodel /home/hsm/project/facialexpress/input/ck+/train/mean.binaryproto  /home/hsm/project/facialexpress/code/predict/classfy.txt /home/hsm/project/facialexpress/input/ck+/test/S113_008_00000503.png

成功的道路总是曲折的,下面就是测试过程中遇到的七七八八的错误了,主要是对deploy.prototxt文件的修改:
这里写图片描述
错因:数据没有正确读入
这里写图片描述
错因:Input类型的input_param**参数格式**写的不对,并且去掉了top:”label”,之前一直按照memorydata数据类型的参数格式照猫画虎的(这次画错了)。
以上错误要吸取的教训是,要对数据层中的数据类型了解(不是随意取的名字)
修改后如下:这里写图片描述
deploy.prototxt文件的其他修改就是:
1.和训练网络时使用的train_val.prototxt文件几乎一样,只是去掉了卷积层全连接层的参数设置
2.最后一层:最后不需要准确率层与损失层了,需要的是概率层,评估图片位于各个分类的概率。
我的最后的deploy.prototxt文件贴一下:


name: "FE"
layer {
  name: "fe-data"
  type: "Input"
  top: "data"
  input_param { shape: { dim:1 dim: 1 dim: 64 dim: 64} }

}
layer {
  name: "conv1"
  type: "Convolution"
  bottom: "data"
  top: "conv1"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  convolution_param {
    num_output: 64
    kernel_size: 5
    stride: 1
   }
}
layer {
  name: "pool1"
  type: "Pooling"
  bottom: "conv1"
  top: "pool1"
  pooling_param {
    pool: MAX
    kernel_size: 2
    stride: 2
  }
}
layer {
  name: "conv2"
  type: "Convolution"
  bottom: "pool1"
  top: "conv2"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  convolution_param {
    num_output: 64
    kernel_size: 5
    stride: 1
   }
}

layer {
  name: "pool2"
  type: "Pooling"
  bottom: "conv2"
  top: "pool2"
  pooling_param {
    pool: MAX
    kernel_size: 2
    stride: 2
  }
}
layer {
  name: "ip1"
  type: "InnerProduct"
  bottom: "pool2"
  top: "ip1"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  inner_product_param {
    num_output: 500
   }
}
layer {
  name: "relu1"
  type: "ReLU"
  bottom: "ip1"
  top: "ip1"
}
layer {
  name: "ip2"
  type: "InnerProduct"
  bottom: "ip1"
  top: "ip2"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  inner_product_param {
    num_output: 6
   }
}
layer {   //概率层
  name: "prob"
  type: "Softmax"
  bottom: "ip2"
  top: "prob"
}

第一次在我的研究课题里照猫画虎的写了这次试验的所有代码和网络,在成功进行了测试图片之后,才基本验证训练没有大问题(因为跑得精度挺高的,估计有数据集数据有重叠有关),尽管测试颇不顺利,最终还是完成了。贴下结果:
这里写图片描述

(2)训练模型批量分类(c++)

http://blog.csdn.net/u010327085/article/details/50527776

(3)训练模型批量分类(python)

说明:可自己添加循环批量读取并测试图片:
for filename in os.listdir(“/home/hsm/project/facialexpress/input/ck+/fold10/crop2/”):

#coding=utf-8

import caffe
import numpy as np
root='/home/xxx/'   #根目录
deploy=root + 'mnist/deploy.prototxt'    #deploy文件
caffe_model=root + 'mnist/lenet_iter_9380.caffemodel'   #训练好的 caffemodel
img=root+'mnist/test/5/00008.png'    #随机找的一张待测图片
labels_filename = root + 'mnist/test/labels.txt'  #类别名称文件,将数字标签转换回类别名称

net = caffe.Net(deploy,caffe_model,caffe.TEST)   #加载model和network

#图片预处理设置
transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})  #设定图片的shape格式(1,3,28,28)
transformer.set_transpose('data', (2,0,1))    #改变维度的顺序,由原始图片(28,28,3)变为(3,28,28)
#transformer.set_mean('data', np.load(mean_file).mean(1).mean(1))    #减去均值,前面训练模型时没有减均值,这儿就不用
transformer.set_raw_scale('data', 255)    # 缩放到【0,255】之间
transformer.set_channel_swap('data', (2,1,0))   #交换通道,将图片由RGB变为BGR

im=caffe.io.load_image(img)                   #加载图片
net.blobs['data'].data[...] = transformer.preprocess('data',im)      #执行上面设置的图片预处理操作,并将图片载入到blob中

#执行测试
out = net.forward()

labels = np.loadtxt(labels_filename, str, delimiter='\t')   #读取类别名称文件
prob= net.blobs['Softmax1'].data[0].flatten() #取出最后一层(Softmax)属于某个类别的概率值,并打印
print prob
order=prob.argsort()[-1]  #将概率值排序,取出最大值所在的序号 
print 'the class is:',labels[order]   #将该序号转换成对应的类别名称,并打印

这里写图片描述

猜你喜欢

转载自blog.csdn.net/u012617944/article/details/78264639