caffe与卷积神经网络

 

date:2017.9-2018.4 purpose:毕设

1caffe

简介

Caffe框架主要有五个组件:BlobSolverNetLayerProto

模型定义在.prototxt文件中,训练好的模型在model目录下.binaryproto格式的文件中。模型的格式由caffe.proto定义。采用Google Protocol Buffer可以节省空间还有它对C++和Pyhton的支持也很好

caffe的matlab和python接口安装

(详细见github的学习笔记中的word文件)

使用微软的caffe版本(https://github.com/Microsoft/caffe)时遇到了"gpu/mxGPUArray.h" Not Found问题,是因为的matlab版本太新了,修改CommonSettings.props配置如下:

$(MatlabDir)\extern\include;$(MatlabDir)\toolbox\distcomp\gpu\extern\include;$(IncludePath)    

具体排查过程,全局查找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>

2卷积神经网络(cnn)

参考:魏秀参 知乎

自从AlexNet在2012年的成功以来,CNN已有各种改进。

而卷积神经网络中conv+relu(早期为sigmoid)+pooling(以下称三剑客)的组合,不仅可以替代手工设计特征算子的繁琐,而且局部感受野+权值共享的设计思想也能避免全连接网络中的种种弊端。此时人们将三剑客的组合视为特征提取的过程,如果按照早期人们特征提取+分类的设计思路,那么分类使用全连接的设计方式,就可以刚好实现了一个end-to-end的架构,也即早起卷积神经网络的原型。

1全连接层(FC)在整个卷积神经网络中起到“分类器”的作用

2softmax等损失函数作为网络目标函数

3微调(fine tuning)是深度学习领域最常用的迁移学习技术。

4特别是在源域与目标域差异较大的情况下,FC可保持较大的模型capacity从而保证模型表示能力的迁移。

局部感知野、权值共享、多卷积核

cnn几个主要部分

1激活函数:Relu; 只对前两个全连接层进行dropout,sigmoid,但实际梯度下降中,sigmoid容易饱和、造成终止梯度传递,且没有0中心化。咋办呢,可以尝试另外一个激活函数:ReLU,常用的非线性激活函数有sigmoid、tanh、relu等等,前两者sigmoid/tanh比较常见于全链接层,后者relu常见于卷积层。ReLU的优点是收敛快,求梯度简单

  • 是数据输入层,对数据做一些处理,比如去均值(把输入数据各个维度都中心化为0,避免数据过多偏差,影响训练效果)、归一化(把所有的数据都归一到同样的范围)、PCA/白化等等。CNN只对训练集做“去均值”这一步。
  • CONV:卷积计算层,线性乘积 求和。
  • RELU:激励层,上文2.2节中有提到:ReLU是激活函数的一种。
  • POOL:池化层,简言之,即取区域平均或最大。
  • FC:全连接层

神经网络

区别CNNRNN,dnn

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 image​s进行相似性度量。原理图如下

Hog:方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。它通过计算和统计图像局部区域的梯度方向直方图来构成特征。Hog特征结合SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功。需要提醒的是,HOG+SVM进行行人检测的方法是法国研究人员Dalal在2005的CVPR上提出的,而如今虽然有很多行人检测算法不断提出,但基本都是以HOG+SVM的思路为主

LBP是一种图像纹理特征(提取算法),它是一种局部特征,是照片分类和人脸检索研究中采用较多的特征提取算法之一。

特征提取算法是模式识别算法的重要组成部分之一,另外一个重要部分是分类算法。

 参考文献及推荐阅读

  1. 人工神经网络wikipedia
  2. 斯坦福机器学习公开课
  3. http://neuralnetworksanddeeplearning.com/
  4. 雨石 卷积神经网络:http://blog.csdn.net/stdcoutzyx/article/details/41596663
  5. cs231n 神经网络结构与神经元激励函数:http://cs231n.github.io/neural-networks-1/中译版
  6. cs231n 卷积神经网络:http://cs231n.github.io/convolutional-networks/
  7. 七月在线寒老师讲的5月dl班第4次课CNN与常用框架视频,已经剪切部分放在七月在线官网:julyedu.com
  8. 七月在线5月深度学习班第5课CNN训练注意事项部分视频:https://www.julyedu.com/video/play/42/207
  9. 七月在线5月深度学习班:https://www.julyedu.com/course/getDetail/37
  10. 七月在线5月深度学习班课程笔记——No.4《CNN与常用框架》:http://blog.csdn.net/joycewyj/article/details/51792477
  11. 七月在线6月数据数据挖掘班第7课视频:数据分类与排序
  12. 手把手入门神经网络系列(1)_从初等数学的角度初探神经网络:http://blog.csdn.net/han_xiaoyang/article/details/50100367
  13. 深度学习与计算机视觉系列(6)_神经网络结构与神经元激励函数:http://blog.csdn.net/han_xiaoyang/article/details/50447834
  14. 深度学习与计算机视觉系列(10)_细说卷积神经网络:http://blog.csdn.net/han_xiaoyang/article/details/50542880
  15. zxy 图像卷积与滤波的一些知识点:http://blog.csdn.net/zouxy09/article/details/49080029
  16. zxy 深度学习CNN笔记:http://blog.csdn.net/zouxy09/article/details/8781543/
  17. http://www.wildml.com/2015/11/understanding-convolutional-neural-networks-for-nlp/中译版
  18. 《神经网络与深度学习》中文讲义:http://vdisk.weibo.com/s/A_pmE4iIPs9D
  19. ReLU与sigmoid/tanh的区别:https://www.zhihu.com/question/29021768
  20. CNN、RNN、DNN内部网络结构区别:https://www.zhihu.com/question/34681168
  21. 理解卷积:https://www.zhihu.com/question/22298352
  22. 神经网络与深度学习简史:1 感知机和BP算法4 深度学习的伟大复兴
  23. 在线制作gif 动图:http://www.tuyitu.com/photoshop/gif.htm
  24. 支持向量机通俗导论(理解SVM的三层境界)
  25. CNN究竟是怎样一步一步工作的? 本博客把卷积操作具体怎么个计算过程写清楚了,但这篇把为何要卷积操作也写清楚了,而且配偶图非常形象

代码阅读

1python

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()]

2脚本代码

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

其他工具与学习

libsvm和matcaffe(caffe+matlab)

调参:学习率,batch,过拟合调整

术语和概念

从神经网络说起:深度学习初学者不可不知的25个术语和概念http://www.afenxi.com/post/44887

你可能感兴趣的:(机器学习)