在此之前我又看了几篇关于caffe配置环境的博客:
http://www.cnblogs.com/cxyxbk/p/5902034.html
http://blog.youkuaiyun.com/qq_14845119/article/details/52415090
http://blog.youkuaiyun.com/muyouhang/article/details/50688038
每次看到csdn的大神发各种神奇的博客,都好佩服,自己都不好意思去注册个csdn,就在这里注册一个为人问津的写写学习笔记,方便自己后期来监督查看自己。
看完之后发现自己上一篇博文里配置caffe环境的时候存在一些缺陷,这里进行一些修正。
1、在点击D:\Caffe\caffe-master\windows该目录下的Caffe.sln用VS2013打开。这里由于别的模块用到了libcaffe,所以,首先选择libcaffe,右键生成。成功之后,再选择整个解决方案,右键生成解决方案。

2、右键解决方案->属性->通用属性->启动项目->当前选定内容,然后保存。

3、点击caffe->caffe.cpp,按F5运行,生成如下界面,证明安装成功。同时在根目录下面会生成相应的exe,lib,dll等文件。
接下来进入正文:
(1)刚一开始就一头雾水了,书中说,执行脚本D:\Caffe\caffe-master\data\mnist,来下载mnist数据集,但是在win7系统cmd中不知道该怎么运行shell脚本,百度了一下,说需要安装git,于是下载https://git-scm.com/download/win安装:
安装完毕,双击“get_mnist.sh”运行界面一闪而过,仔细看了运行结果,应该是没有下载成功,突然想到了,linux下使用命令下载东西的,windows下可以直接浏览器输网址下载啊,这就是作为一个小白的悲哀啊,也许过几个月后再回头来看这些问题,会被自己的愚蠢笑哭的,于是输入了网址http://yann.lecun.com/exdb/mnist,下载:

(2)下载完毕得到4个文件,解压。

下载完毕这四个文件分别放在哪里呢?看看D:\Caffe\caffe-master\examples\mnist\create_mnist.sh这个文件内容:DATA=data/mnist,原来是下载到了
D:\Caffe\caffe-master\data\mnist这个目录里,也就是“get_mnist.sh”所在的文件夹。
打开git。cd到caffe的根目录,执行命令 ./examples/mnist/create_mnist.sh
运行结果:
Creating lmdb...
./examples/mnist/create_mnist.sh: line 17: build/examples/mnist/convert_mnist_data.bin: No such file or directory
没有找到目录。
(3)保险起见,先把create_mnist.sh备份一下,打开文件修改其内容:这也是经过了很多次尝试才知道是这样修改的:

如果说有如下错误,那就是因为你没有将上图中的“-”改为“.”这应该是linux和windows下的文件名不一致造成的F0330 15:27:41.177140
4520 convert_mnist_data.cpp:53] Check failed: image_file Unable to open file data/mnist/train-images-idx3-ubyte

这样在此执行, cd 切换到d:\ Caffe/caffe-master/目录。执行./examples/mnist/create_mnist.sh就得到了激动人心的画面:

并且在D:\Caffe\caffe-master\examples\mnist目录下自动生成了两个文件夹:

如此,这个就算是将下载到的4个二进制文件,转化为了LEVELDB和LMDB格式。
(4)当然还有另外一种办法,就是
在caffe根目录下,新建一个create_mnist.bat,里面写入如下的脚本:
.\Build\x64\Release\convert_mnist_data.exe .\data\mnist\train-images.idx3-ubyte .\data\mnist\train-labels.idx1-ubyte .\examples\mnist\mnist_train_lmdb
echo.
.\Build\x64\Release\convert_mnist_data.exe .\data\mnist\t10k-images.idx3-ubyte
.\data\mnist\t10k-labels.idx1-ubyte .\examples\mnist\mnist_test_lmdb
pause
但是其中这个地址要改成你自己的实际地址

同样也可以达到相同的效果。

(5)
接下来就是进行
训练了,但是在此之前要,确认修改D:\Caffe\caffe-master\examples\mnist\lenet_solver.prototxt,将最后一行改为solver_mode:CPU,上一篇博文已经进行了修改这里就跳过该步骤。
(6)开始训练,在git中输入如下内容,(这里我们第一次使用了caffe工具的train命令)
./Build/x64/Release/caffe.exe train -solver examples/mnist/lenet_solver.prototxt

貌似是开始训练了,不知道要等多久,拭目以待吧,这里想吐槽一下,git里面目录地址中用的是“/”而windows中用的是“\”太不人性化了,就不能统一一下吗。。。
当然也可以将D:\Caffe\caffe-master\examples\mnist\train_lenet.sh文件进行修改然后执行它也是可以的

将其中的目录地址改为自己的真实地址,这样同样能达到效果,笔者这里就没有尝试了,毕竟这个脚本里也就只有一句话。
(7)训练结束,经过大约10多分钟,训练结束,并且在D:\Caffe\caffe-master\examples\mnist下生产了新的4个文件:

(8)理解过程,照着样子,是完整的跑完一遍,但具体为什么这么做,还是不明白啊,那就翻翻书,查查网络资料,好好理解一下吧。
这里摘录一个网页的内容
http://www.2cto.com/kf/201611/561111.html是对LeNet模型的理解
现在,我们来具体看一下lenet_train_test.prototxt这个文件的具体内容:
/
layer {
name: "mnist"
//[1]数据层的名字为--mnist
type: "Data"
//[2]层的层类型:Data(数据层)(数据库作为输入)
top: "data"
//[3]数据层的输出blob有两个:data,label(对应生成的CNN图看)
top: "label"
include {
//[4]include里面的数据说明,该层只在训练阶段有效
phase: TRAIN
}
transform_param {
//[5]数据预处理,转换参数的定义
scale: 0.00390625
//[5]特征归一化系数,将范围为[0,255]的MNIST数据归一化为[0,1]
}
data_param {
//[6]数据层的参数
source: "examples/mnist/mnist_train_lmdb"//[1]由于该数据层的数据来源是数据库(由层类型Data指定),
//
因此,source对应的就是数据库LMDB的路径,也就是训练
//
数据和测试数据的path
batch_size: 64
//[2]批量数目,表示caffe一次从数据库LMDB读入的图片的数量
backend: LMDB
//[3]数据库的类型说明区别于LevelDB数据库
}
}
layer {
name: "mnist"
type: "Data"
top: "data"
top: "label"
include {
phase: TEST
}
transform_param {
scale: 0.00390625
}
data_param {
source: "examples/mnist/mnist_test_lmdb"
batch_size: 100
backend: LMDB
}
}
layer {
name: "conv1"
type: "Convolution"
bottom: "data"
//[1]卷积层的输入blob为data
top: "conv1"
//[2]卷积层的输出blob为conv1
param {
//[3]卷积层的:权值学习速率倍乘因子,1表示,保持与全局参数一致
lr_mult: 1
}
param {
//[4]卷积层的:偏置项的学习速率倍乘因子,是全局参数的2倍
lr_mult: 2
}
convolution_param {
//[5]卷积层的计算参数
num_output: 20
//[1]输出feature map的数目为20,对应的也就是卷积核的数量
kernel_size: 5
//[2]卷积核的尺寸为:5*5
stride: 1
//[3]卷积核在输入图片上滑动的步长为:1
weight_filler {
//[6]指定权值的初始化方案为:xavier
type: "xavier"
}
bias_filler {
//[7]偏执项的初始化方案为:constant,默认为0
type: "constant"
}
}
}
layer {
name: "pool1"
type: "Pooling"
bottom: "conv1"
top: "pool1"
pooling_param {
//[1]池化层(下采样)的参数
pool: MAX
//[1]目前提供了三种池化的方法:最大值池化,均值池化,随机池化
//
很明显,该池化层使用了最大值池化MAX
kernel_size: 2
//[2]指定池化窗口的宽度和高度:2*2
stride: 2
//[3]指定池化窗口在输入数据上滑动的步长为:2
}
}
layer {
name: "conv2"
type: "Convolution"
bottom: "pool1"
top: "conv2"
param {
lr_mult: 1
}
param {
lr_mult: 2
}
convolution_param {
num_output: 50
kernel_size: 5
stride: 1
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
}
}
}
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 {
//[1]全连接层的参数:
num_output: 500
//[1]该层的输出元素的个数为:500
weight_filler {
//[2]指定全连接层的初始化方案:xavier
type: "xavier"
}
bias_filler {
type: "constant"
}
}
}
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 {
//[1]全连接层的计算参数
num_output: 10
//[1]该层的输出为10个特征,对应0--9这10类数字
weight_filler {
//[2]该层在网络初始化的初始化方案为:xavier
type: "xavier"
}
bias_filler {
//[3]给该层添加偏置项,偏置项网络的初始化方案为:constant
type: "constant"
}
}
}
layer {
name: "accuracy"
type: "Accuracy"
bottom: "ip2"
bottom: "label"
top: "accuracy"
include {
phase: TEST
}
}
layer {
name: "loss"
type: "SoftmaxWithLoss"
bottom: "ip2"
bottom: "label"
top: "loss"
}

C 基础较弱,上面的图并没有完全理解,后面再深入研究,感觉每天自己都留下一个坑,后面要填平的坑还很多。。。。