为了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值。
看了看,还不太理解