为了caffe(六)学人家博客的---第二天

为了caffe(六)学人家博客的---第二天

 

 

caffe的python接口学习(1):生成配置文件

 

 

就是用python写代码,生成训练prototxt文件和验证prototxt文件。(之前没有写过prototxt,都是用的现成的),

 

因为prototxt里面会写上,数据层的数据来源(比如来自lmdb文件,或者直接来自图片文件也行),所以就要在生成prototxt文件的代码里写入数据来源的路径

 

如果不用python写代码生成prototxt文件,那也可以直接打开一个空白文件,一层层的写layer,不过那样可能一不小心就出错了,也麻烦

 

 

 

caffe的python接口学习(2):生成solver文件 

 

 

感觉这些生成训练prototxt文件和验证prototxt文件和solver.prototxt文件的 python都是楼主自己写的吧,而不某个官方教程里面的东西。楼主水平真是高,就像冰山一角一样

 

caffe的python接口学习(3):训练模型(training)

 

 

 

整个的过程都可以用python和c++命令行解决, 有的地方两者都可用,选其一。。。

 

 

caffe的python接口学习(4):mnist实例---手写数字识别 

 

深度学习的第一个实例一般都是mnist,只要这个例子完全弄懂了,其它的就是举一反三的事了。

 

 

 

一、数据准备

官网提供的mnist数据并不是图片,但我们以后做的实际项目可能是图片。因此有些人并不知道该怎么办。在此我将mnist数据进行了转化,变成了一张张的图片,我们练习就从图片开始。mnist图片数据我放在了百度云盘。

(这个转化过程可以用c++和opencv做的,,,,也可以用python做(这时不用opencv了))

 

 

 

然后:

用python生成配置文件,就是train.prototxt和test.prototxt,,,楼主这里用了leNet网络

用python生成参数文件,就是solver.prototxt

用python开始训练,生成caffemodel

 

注意:

sudo python mnist/mnist.py

dong@dong-Lenovo-G480:~$ sudo python mnist/mnist.py

Traceback (most recent call last):

  File "mnist/mnist.py", line 3, in

    import caffe

ImportError: No module named caffe

dong@dong-Lenovo-G480:~$ sudo python mnist/mnist.py

Traceback (most recent call last):

  File "mnist/mnist.py", line 3, in

    import caffe

ImportError: No module named caffe

不行

但是去掉sudo 就ok了  不知道为什么???

 

 

 

参数解释:

TRAIN数据集 60000张  分为10类

      TEST数据集    10000张 分类 10类

 

数据层分2种,train和test ,分别对应一个train.prototxt和一个test.prototxt文件,两个文件大同小异,只是数据层不同,最后的输出层,test.prototxt比train.prototxt多了输出精度。

(确实有些train和test数据层都在一个prototxt文件里面,我还不懂,另作讨论)

 

 

 

 

数据层分2种,train和test,每一个都有一个batch_size

 

以train为例

设 batch_size为64,就是每次训练64张图片,理解为每次给GPU64张图片

那么就需要N次,才能跑完一遍60000个训练数据,处理完一遍,叫做一代,英文叫epoch

那么 N就是 60000/64=937.5约等于938, = test_interval,(test_interval是用于训练的时候,test_iter是用于测试的时候)

所以训练938次就是完整的训练了一次,就要测试一下。如果想要100代,就设max_iter=93800(也不能从英文字面上理解,这个的意思是93800次训练64张图片,93800次给GPU64张图片)

 

 

 

训练完一次就要测试一次,

在test.prototxt里面设batch_size = 100,每次测100张图,就是给GPU100张图

所以 test_iter = 10000/100=100,才算完成了一次完成的数据测试

 

 

成功了

 

截取中间一段:

I0830 12:38:06.470535  4351 solver.cpp:244]     Train net output #0: SoftmaxWithLoss1 = 0.00935682 (* 1 = 0.00935682 loss)

I0830 12:38:06.470548  4351 sgd_solver.cpp:106] Iteration 6520, lr = 0.0001

I0830 12:38:08.155113  4351 solver.cpp:228] Iteration 6540, loss = 0.000966468

I0830 12:38:08.155165  4351 solver.cpp:244]     Train net output #0: SoftmaxWithLoss1 = 0.000966544 (* 1 = 0.000966544 loss)

I0830 12:38:08.155187  4351 sgd_solver.cpp:106] Iteration 6540, lr = 0.0001

I0830 12:38:09.839825  4351 solver.cpp:228] Iteration 6560, loss = 9.36573e-05

I0830 12:38:09.839879  4351 solver.cpp:244]     Train net output #0: SoftmaxWithLoss1 = 9.37316e-05 (* 1 = 9.37316e-05 loss)

I0830 12:38:09.839900  4351 sgd_solver.cpp:106] Iteration 6560, lr = 0.0001

I0830 12:38:10.261059  4351 solver.cpp:454] Snapshotting to binary proto file /home/dong/mnist/lenet_iter_6566.caffemodel

I0830 12:38:10.324697  4351 sgd_solver.cpp:273] Snapshotting solver state to binary proto file /home/dong/mnist/lenet_iter_6566.solverstate

I0830 12:38:10.327386  4351 solver.cpp:337] Iteration 6566, Testing net (#0)

I0830 12:38:14.178642  4351 solver.cpp:404]     Test net output #0: Accuracy1 = 0.9912

I0830 12:38:14.178798  4351 solver.cpp:404]     Test net output #1: SoftmaxWithLoss1 = 0.0275033 (* 1 = 0.0275033 loss)

I0830 12:38:15.385162  4351 solver.cpp:228] Iteration 6580, loss = 0.00669877

I0830 12:38:15.385224  4351 solver.cpp:244]     Train net output #0: SoftmaxWithLoss1 = 0.00669885 (* 1 = 0.00669885 loss)

I0830 12:38:15.385239  4351 sgd_solver.cpp:106] Iteration 6580, lr = 0.0001

 

 

解释深绿色部分,在10秒的时候,保存了 caffemodel文件,进过4秒测试,显示精度

解释蓝色部分  就是938, = test_interval  每938次,也就是每训练完了全部的完整的训练集,就测试一次

解释深红色部分,,,这个就是网络文件prototxt最后一层的那个top,就是输出,, SoftmaxWithLoss1,下次试试改成 SoftmaxWithLoss_hahahaha 看看效果

 

 

截取最最最后面的内容

 

 

I0830 12:42:12.227732  4351 sgd_solver.cpp:106] Iteration 9300, lr = 1e-05

I0830 12:42:13.912281  4351 solver.cpp:228] Iteration 9320, loss = 0.0037416

I0830 12:42:13.912328  4351 solver.cpp:244]     Train net output #0: SoftmaxWithLoss1 = 0.00374172 (* 1 = 0.00374172 loss)

I0830 12:42:13.912343  4351 sgd_solver.cpp:106] Iteration 9320, lr = 1e-05

I0830 12:42:15.596761  4351 solver.cpp:228] Iteration 9340, loss = 0.00954666

I0830 12:42:15.596817  4351 solver.cpp:244]     Train net output #0: SoftmaxWithLoss1 = 0.00954678 (* 1 = 0.00954678 loss)

I0830 12:42:15.596832  4351 sgd_solver.cpp:106] Iteration 9340, lr = 1e-05

I0830 12:42:17.281905  4351 solver.cpp:228] Iteration 9360, loss = 0.00011646

I0830 12:42:17.281954  4351 solver.cpp:244]     Train net output #0: SoftmaxWithLoss1 = 0.000116582 (* 1 = 0.000116582 loss)

I0830 12:42:17.281970  4351 sgd_solver.cpp:106] Iteration 9360, lr = 1e-05

I0830 12:42:18.882935  4351 solver.cpp:454] Snapshotting to binary proto file /home/dong/mnist/lenet_iter_9380.caffemodel

I0830 12:42:18.946923  4351 sgd_solver.cpp:273] Snapshotting solver state to binary proto file /home/dong/mnist/lenet_iter_9380.solverstate

I0830 12:42:18.974546  4351 solver.cpp:317] Iteration 9380, loss = 0.00249967

I0830 12:42:18.974599  4351 solver.cpp:337] Iteration 9380, Testing net (#0)

I0830 12:42:22.825633  4351 solver.cpp:404]     Test net output #0: Accuracy1 = 0.9914

I0830 12:42:22.825680  4351 solver.cpp:404]     Test net output #1: SoftmaxWithLoss1 = 0.0272464 (* 1 = 0.0272464 loss)

I0830 12:42:22.825700  4351 solver.cpp:322] Optimization Done.

 

还是有不懂的 那个 Accuracy很好理解,但是SoftmaxWithLoss1 = 0.0272464 (* 1 = 0.0272464 loss) 是什么意思?还不懂?

 

 

 

 

自己修改试试   1修改s.display = 1000  减少显示

  2修改s.snapshot_prefix = root+'mnist/lenethaha'   #修改caffemodel 前缀 看看什么效果?效果就是 lenethaha后面系统自己加上了迭代的次数,

举例:lenethaha_iter_2814.solverstate

 

 

 

ps: 训练和测试的顺序是什么样的?  

不是:  

 先训练跑一遍,再测试跑一遍,跑测试的时候不停的出accuracy和loss,这样的话accuracy和loss就不会变化了,跟观察到的不一样

 

我猜是:   

先跑一遍完整的训练集数据,这时候得到了一个caffemodel(caffemodel本质上是一堆参数,这些参数是y=f(wx+b)中的w和b,第8节讲到了这个,这些参数不一定会以caffemodel的文件格式保存下来,这就涉及到参数snap_shot,它表示多少次完整训练之后,换个说法,多少代之后保存一次caffemodel文件),对于这个caffemodel跑一遍完整的测试数据,得到一个accuracy和loss,再跑一遍完整的训练集数据,这时候又可以得到了一个caffemodel,再一次对于这个caffemodel跑一遍完整的测试数据,就再一次得到一个accuracy和loss,一般来说这个accuracy上升和loss降低。。。。这也符合观察到的情况

 

pss: 那么这个训练和测试的过程怎么对应,网络图呢?比如在mnsit上,以上说的这些怎么对应leNet的那个网络结构??  

我猜的:

那就是无数次的运行这个网络图,从上往下的, 第一次运行之后这个网络中会有很多参数,第二次这些图输入之后,网络中的参数就改变了,优化了,所以就会使得accuracy上升和loss降低。无数次输入图片,改变参数之后,网络达到一个很优化的各个参数。如果这时候测试它,会得到很高accuracy和很低的loss。

这个参数就是卷积核的数值,卷积核大小是固定的,但是它的每个点上的数值,是一次次优化最终确定的。还有不但是卷积核的数值,还有偏置量也是通过优化确定的。。 第8节讲到了这个caffe的python接口学习(8):caffemodel中的参数及特征的抽取

 

 

我感觉我已经很接近真像了。   根据以往经验就算老师不问的详细,我最好说的详细,显得牛逼

 

 

pss:

(确实有些train和test数据层都在一个prototxt文件里面,我还不懂,另作讨论)

我知道了

如果是一个文件里   那就是 net: "examples/mnist/lenet_train_test.prototxt"

如果分开就是   test_net: “/home/xxx/data/val.prototxt”

         train_net: “/home/xxx/data/proto/train.prototxt” 

对应的 python里面生成代码就是:

   s.train_net =train_net

      s.test_net.append(test_net)

 

 

 

caffe的python接口学习(5):生成deploy文件

 

如果要把训练好的模型拿来测试新的图片,那必须得要一个deploy.prototxt文件,这个文件实际上和test.prototxt文件差不多,也是个网络,只 是头尾不相同而也。deploy文件没有第一层数据输入层,也没有最后的Accuracy层,但最后多了一个Softmax概率层。

这个deploy.prototxt文件在前面用c++命令行做分类的时候,也提到过,当时还不知道是个啥。Caffe学习系列(20):用训练好的caffemodel来进行分类

 

 

 

楼主用了python代码生成这个文件

楼主说:

这个文件不推荐用代码来生成,反而麻烦。大家熟悉以后可以将test.prototxt复制一份,修改相应的地方就可以了,更加方便。

 

 注意学习deploy文件的,需要更多的资料,原作者这里是不够的,更多的参考http://blog.csdn.net/u010417185/article/details/52137825  等等等

 

caffe的python接口学习(6):用训练好的模型(caffemodel)来分类新的图片

终于快要完成了。

 

前面那个分类是识别物体的,基于imagenet数据集,用了caffenet网络

这回是mnist数据集,用leNet网络

 

 

 

用python实现啊,载入caffemodel文件,载入deploy.prototxt文件,输入测试图片,会的到属于某个类别概率,取最大的概率那个

 

 

原代码有个小错误,也在评论里解决了,就是:

博主,这个有问题order=prob.argsort()[0] 
将概率值排序,取出最大值所在的序号 应该是倒数第一个所以是-1
order=prob.argsort()[-1]

 

 

 

 

楼主说:

经过前面两篇博文的学习,我们已经训练好了一个caffemodel模型,并生成了一个deploy.prototxt文件,现在我们就利用这两个文件来对一个新的图片进行分类预测。

我们从mnist数据集的test集中随便找一张图片,用来进行实验。

 

 

 

 

 

 

 

 

caffe的python接口学习(7):绘制loss和accuracy曲线 

 

 

 

 

试了试spyder ,挺好啊哈

 

 

 

 

caffe的python接口学习(8):caffemodel中的参数及特征的抽取

 

 

如果用公式  y=f(wx+b)

来表示整个运算过程的话,那么w和b就是我们需要训练的东西,w称为权值,在cnn中也可以叫做卷积核(filter),b是偏置项。f是激活函数,有sigmoid、relu等。x就是输入的数据。

数据训练完成后,保存的caffemodel里面,实际上就是各层的w和b值。

 

 

看了看,还不太理解

你可能感兴趣的:(为了caffe(六)学人家博客的---第二天)