date:2017.9-2018.4 purpose:毕设
Caffe框架主要有五个组件:Blob,Solver,Net,Layer,Proto,
模型定义在.prototxt文件中,训练好的模型在model目录下.binaryproto格式的文件中。模型的格式由caffe.proto定义。采用Google Protocol Buffer可以节省空间还有它对C++和Pyhton的支持也很好
(详细见github的学习笔记中的word文件)
使用微软的caffe版本(https://github.com/Microsoft/caffe)时遇到了"gpu/mxGPUArray.h" Not Found问题,是因为的matlab版本太新了,修改CommonSettings.props配置如下:
具体排查过程,全局查找mxGPUArray.h,发现在$(MatlabDir)\toolbox\distcomp\gpu\extern\include路径下,遂在配置中加上。估计是matlab新版本中gpu文件夹已从\extern\include独立出来了。
Python:
:无法打开包括文件 "pyconfig" no such file or directory
Python的路径换成绝对路径 :<IncludePath>$(PythonDir)\include;D:\AnZhuangbao\p_anaconda\include;$(IncludePath)IncludePath>
参考:魏秀参 知乎
自从AlexNet在2012年的成功以来,CNN已有各种改进。
而卷积神经网络中conv+relu(早期为sigmoid)+pooling(以下称三剑客)的组合,不仅可以替代手工设计特征算子的繁琐,而且局部感受野+权值共享的设计思想也能避免全连接网络中的种种弊端。此时人们将三剑客的组合视为特征提取的过程,如果按照早期人们特征提取+分类的设计思路,那么分类使用全连接的设计方式,就可以刚好实现了一个end-to-end的架构,也即早起卷积神经网络的原型。
1全连接层(FC)在整个卷积神经网络中起到“分类器”的作用
2softmax等损失函数作为网络目标函数
3微调(fine tuning)是深度学习领域最常用的迁移学习技术。
4特别是在源域与目标域差异较大的情况下,FC可保持较大的模型capacity从而保证模型表示能力的迁移。
局部感知野、权值共享、多卷积核
1激活函数:Relu; 只对前两个全连接层进行dropout,sigmoid,但实际梯度下降中,sigmoid容易饱和、造成终止梯度传递,且没有0中心化。咋办呢,可以尝试另外一个激活函数:ReLU,常用的非线性激活函数有sigmoid、tanh、relu等等,前两者sigmoid/tanh比较常见于全链接层,后者relu常见于卷积层。ReLU的优点是收敛快,求梯度简单
CNN 专门解决图像问题的,可用把它看作特征提取层,放在输入层上,最后用MLP 做分类。
RNN 专门解决时间序列问题的,用来提取时间序列信息,放在特征提取层
DNN 说白了就是 多层网络,只是用了很多技巧,让它能够 deep 。
人工特征:sift,spin image,HoG,RIFT,GLOH,Textons
SIFT,即尺度不变特征变换(Scale-invariant feature transform,SIFT),是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子
第一阶段:SIFT特征的生成,即从多幅图像中提取对尺度缩放、旋转、亮度变化无关的特征向量。第二阶段:SIFT特征向量的匹配
Spin image的思想是将一定区域的点云分布转换成二维的spin image,然后对场景和模型的spin images进行相似性度量。原理图如下
Hog:方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。它通过计算和统计图像局部区域的梯度方向直方图来构成特征。Hog特征结合SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功。需要提醒的是,HOG+SVM进行行人检测的方法是法国研究人员Dalal在2005的CVPR上提出的,而如今虽然有很多行人检测算法不断提出,但基本都是以HOG+SVM的思路为主
LBP是一种图像纹理特征(提取算法),它是一种局部特征,是照片分类和人脸检索研究中采用较多的特征提取算法之一。
特征提取算法是模式识别算法的重要组成部分之一,另外一个重要部分是分类算法。
net = caffe.Net(model_def, # 定义模型结构deploy.prototxt
model_weights, # 包含了模型的训练权值bvlc_reference_caffenet.caffemodel
caffe.TEST) # 使用测试模式(不执行dropout)??
设置输入图像大小??
# 加载ImageNet图像均值 (随着Caffe一起发布的)????
mu = np.load(caffe_root + 'python/caffe/imagenet/ilsvrc_2012_mean.npy')
mu = mu.mean(1).mean(1) # 对所有像素值取平均以此获取BGR的均值像素值
print 'mean-subtracted values:', zip('BGR', mu)
# 对输入数据进行变换 ????caffe.io.Transformer
transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})
transformer.set_transpose('data', (2, 0, 1)) # 将图像的通道数设置为outermost的维数
transformer.set_mean('data', mu) # 对于每个通道,都减去BGR的均值像素值
transformer.set_raw_scale('data', 255) # 将像素值从[0,255]变换到[0,1]之间
transformer.set_channel_swap('data', (2, 1, 0)) # 交换通道,从RGB变换到BGR
# 设置输入图像大小
net.blobs['data'].reshape(50, # batch 大小 ????net.blobs
3, # 3-channel (BGR) images
227, 227) # 图像大小为:227x227
# 3.2 加载图像(caffe自带的)并进行预处理。caffe.io.load_image
image = caffe.io.load_image(caffe_root + 'examples/images/cat.jpg')
transformed_image = transformer.preprocess('data', image)
plt.imshow(image)
plt.show()
# 将图像数据拷贝到为net分配的内存中
net.blobs['data'].data[...] = transformed_image
### 执行分类
output = net.forward()
output_prob = output['prob'][0] # batch中第一张图像的概率值
print 'predicted class is:', output_prob.argmax()
2
# 加载ImageNet标签,确定类别
labels_file = caffe_root + 'data/ilsvrc12/synset_words.txt'
# if not os.path.exists(labels_file): !../data/ilsvrc12/get_ilsvrc_aux.sh
labels = np.loadtxt(labels_file, str, delimiter='\t') #分割
print 'output label:', labels[output_prob.argmax()]
1二进制到lmdb
测试图片和标签转换成二进制:
D:\AnZhuangbao\caffe\719\caffe-master716\caffe-master\data\mnist\812testmnist的readjpg.m
二进制转换成lmdb
create_mnist.bat
..\..\Build\x64\Release\convert_mnist_data.exe train-images.idx3-ubyte train-labels.idx1-ubyte..\..\examples\mnist\mnist_train_lmdb
2图像到lmdb,用python??/convert_imageset
利用convert_imageset
1创建图片清单
create_filelist.sh
# /usr/bin/env sh
DATA=examples/images
echo "Create train.txt..."
rm -rf $DATA/train.txt
find $DATA -name *cat.jpg | cut -d '/' -f3 | sed "s/$/ 1/">>$DATA/train.txt
find $DATA -name *bike.jpg | cut -d '/' -f3 | sed "s/$/ 2/">>$DATA/tmp.txt
cat $DATA/tmp.txt>>$DATA/train.txt
rm -rf $DATA/tmp.txt
echo "Done.."
create_lmdb.sh
#!/usr/bin/en sh
DATA=examples/images
rm -rf $DATA/img_train_lmdb
build/tools/convert_imageset --shuffle \--resize_height=256 --resize_width=256 \/home/xxx/caffe/examples/images/ $DATA/train.txt $DATA/img_train_lmdb
得到db文件
1
3、create_mnist812.bat,mnist二进制生成lmdb
..\..\Build\x64\Release\convert_mnist_data.exe test_img_ubyte test_lable_ubyte ..\..\examples\mnist\mnist_test_lmdb
4、mnist_test.bat
4均值文件生成与使用,
利用caffe的compute_image_mean.exe
利用mnist_mean.bat
Build\x64\Release\compute_image_mean.exe examples\mnist\mnist_train_lmdb mean.binaryproto --backend=lmdb
Pause
##
提取特征:caffe的工具
$TOOL/extract_features.bin $MODEL $PROTOTXT $LAYER $LEVELDB $BATCHSIZE
build/tools/extract_features.bin examples/imagenet/caffe_reference_imagenet_model
examples/_temp/imagenet_val.prototxt fc7 examples/_temp/features 10
其中 fc7 是最高层的特征,我们也可以使用其他层提取,像 conv5 或 pool3
备注:用 caffe 的 python 接口提取和保存特征到text文本下
features = net.blobs['conv5'].data # 提取卷积层 5 的特征
np.savetxt('conv5_feature.txt', features) # 将特征存储到本文文件中
#!/usr/bin/env sh
# args for EXTRACT_FEATURE
TOOL=../../build/tools
MODEL=../../examples/imagenet/caffe_reference_imagenet_model #下载得到的caffe model
PROTOTXT=../../examples/_temp/imagenet_val.prototxt # 网络定义
LAYER=conv1 # 提取层的名字,如提取fc7等
LEVELDB=../../examples/_temp/features_conv1 # 保存的leveldb路径
BATCHSIZE=10
# args for LEVELDB to MAT
DIM=290400 # 需要手工计算feature长度
OUT=../../examples/_temp/features.mat #.mat文件保存路径
BATCHNUM=1 # 有多少哥batch, 本例只有两张图, 所以只有一个batch
$TOOL/extract_features.bin $MODEL $PROTOTXT $LAYER $LEVELDB $BATCHSIZE
python leveldb2mat.py $LEVELDB $BATCHNUM $BATCHSIZE $DIM $OUT
网络
1生成txt,matlab或者脚本
http://www.cnblogs.com/denny402/p/5083300.html
3solver.prototxt参数说明
olver算是caffe的核心的核心,它协调着整个模型的运作。caffe程序运行必带的一个参数就是solver配置文件。运行代码一般为
# caffe train --solver=*_slover.prototxt
在Deep Learning中,往往loss function是非凸的,没有解析解,我们需要通过优化方法来求解。solver的主要作用就是交替调用前向(forward)算法和后向(backward)算法来更新参数,从而最小化loss,实际上就是一种迭代的优化算法。
到目前的版本,caffe提供了六种优化算法来求解最优参数,在solver配置文件中,通过设置type类型来选择,接下来,我们先来看一个实例:
net: "examples/mnist/lenet_train_test.prototxt" #设置深度网络模型。每一个模型就是一个net
test_iter: 100
test_interval: 500
base_lr: 0.01
momentum: 0.9
type: SGD
weight_decay: 0.0005
lr_policy: "inv"
gamma: 0.0001
power: 0.75
display: 100
max_iter: 20000
snapshot: 5000
snapshot_prefix: "examples/mnist/lenet"
solver_mode: CPU
调参:学习率,batch,过拟合调整
从神经网络说起:深度学习初学者不可不知的25个术语和概念http://www.afenxi.com/post/44887