caffe for windows的matlab接口(二):进行训练以及绘制loss
2016-12-06 14:59
585 查看
参考:这里写链接内容
转载:这里写链接内容
为了文件夹不错乱,我在安装了Matlab的Caffe-master并列目录下建立了一个文件夹Mat_Train,在这个文件夹里放入了我们训练所需要的全部的东西。。。
保险起见,还是先尝试给出的案例,再尝试我的手掌识别案例。
mnist_data文件夹里存的是mnist数据集的lmdb文件以及lenet.prototxt。
移动完毕,接下来需要修改lenet_solver1.prototxt里面的路径:
lenet_train_test1.prototxt 被修改部分
再进行下一步操作之前,最好用bat测试一下是否能读取到这个prototxt并训练,排除这一步错误才能进行下步工作。
修改我的trainminist.bat文件,
测试一次能成功运行就可以,
结果,
显示一下,
运行以后matlab跟待机一样,啥输出都没。显示正忙。。。
还以为出错,分析上面solver读取的两个net:
模型的输入竟然是empty的,难道我们的lmdb数据没有读进去,然后尝试了leveldb,以及各种改leveldb的路径,比如添加“./”之类的,都不行。这时候便想到了一种可能性,模型载入是不读取数据的,只有在运行时候读取数据,但是solver的solve方法是一次性训练模型,没有任何输出,matlab可能已经在训练模型了。
而且这时候我的电脑风扇响得很厉害。。。一般来说这样的话就是在运行东西了。其实这时候我们还可以看一眼我们的任务管理器,按Ctrl+Shift+Esc,打开任务管理器,发现matlab确实在运行东西,
等待一段时间之后,果然在solver文件中的指定路径下看到了我们训练好的model。。。
为了避免这些模型是用空数据训练的,使用mnist的classification_demo测试一下,竟然手写数字都分类正确,这样便验证了我们的想法:solver.solve()是一次性训练数据,不会附带任何输出,matlab表现会如死机了。
ta表达的意思是我们可以用step命令设置每次训练多少次以后,可以干一下别的事情,然后再进行训练。。。
好,卡壳了,设置完毕step为1表示我们想在每一次迭代都取出loss和accuracy,但是然后呢?怎么继续训练?找了很多教程都是Python的,受次启发,以及反复看caffe的官网,发现:
给出的解释简单翻译一下是:
net.forward 函数接受n维的输入,输出output的blob的数据
net.forward_prefilled使用的则是使用在模型中已经存在的数据继续训练,并不接受任何输入,以及提供任何输出。
看完这两个解释,思考一下,用step设置训练1次停一下,那么我们的数据是否依旧在blob中存着呢?
【最开始想法】那么就可以使用net.forward_prefilled做继续训练的工作,尝试一下:
【试验之后】按照上面的想法能训练,但是突然发现,为什么不要backward_prefilled呢?而且,去掉solver.net.forward_prefilled也能训练。应该是solver.step自动包含了forward和backward过程了,因此正式使用的训练代码是:
接下来就是取出每次迭代的loss和accuracy了,想都不用想,用blob,为了训练快点,可以切换到GPU版本的caffe-windows,(我的显卡刚刚好不支持GPU三倍加速)代码如下:
要迭代10000次,每次画出loss,用CPU速度还是很慢的。。。这里截取了几张过程图,可以看到loss是没问题的,一直震荡下降。
为了避免训练错误,我们来测试一下:
在开机命令窗口输入%tmp%
按时间排序,找到最近的以caffe.exe开头的文件名称,用notepad++打开可以看到日志信息:
因为我的这里没有最近训练的记录,所以只说下方法···
读文件的方法有很多,我用正则表达式去匹配loss信息:
先将这个记录log的文件拷贝出来,
比如:
运行:
转载:这里写链接内容
为了文件夹不错乱,我在安装了Matlab的Caffe-master并列目录下建立了一个文件夹Mat_Train,在这个文件夹里放入了我们训练所需要的全部的东西。。。
保险起见,还是先尝试给出的案例,再尝试我的手掌识别案例。
mnist_data文件夹里存的是mnist数据集的lmdb文件以及lenet.prototxt。
移动完毕,接下来需要修改lenet_solver1.prototxt里面的路径:
# The train/test net protocol buffer definition net: "lenet_train_test1.prototxt" # test_iter specifies how many forward passes the test should carry out. # In the case of MNIST, we have test batch size 100 and 100 test iterations, # covering the full 10,000 testing images. test_iter: 100 # Carry out testing every 500 training iterations. test_interval: 500 # The base learning rate, momentum and the weight decay of the network. base_lr: 0.01 momentum: 0.9 weight_decay: 0.0005 # The learning rate policy lr 4000 _policy: "inv" gamma: 0.0001 power: 0.75 # Display every 100 iterations display: 100 # The maximum number of iterations max_iter: 10000 # snapshot intermediate results snapshot: 5000 snapshot_prefix: "mnist_data/lenet" # solver mode: CPU or GPU solver_mode: CPU
lenet_train_test1.prototxt 被修改部分
name: "LeNet" layer { name: "mnist" type: "Data" top: "data" top: "label" include { phase: TRAIN } transform_param { mean_file: "mean.binaryproto" scale: 0.00390625 } data_param { source: "mnist_data/mnist_train_lmdb" batch_size: 64 backend: LMDB } } layer { name: "mnist" type: "Data" top: "data" top: "label" include { phase: TEST } transform_param { mean_file: "mean.binaryproto" scale: 0.00390625 } data_param { source: "mnist_data/mnist_test_lmdb" batch_size: 100 backend: LMDB } }
再进行下一步操作之前,最好用bat测试一下是否能读取到这个prototxt并训练,排除这一步错误才能进行下步工作。
修改我的trainminist.bat文件,
F:\CaffeDev\Caffe-master\Build\x64\Release\caffe.exe train --solver=F:/CaffeDev/Mat_Train/lenet_solver1.prototxt pause
测试一次能成功运行就可以,
读入模型
接下来再去读模型:caffe.reset_all solver = caffe.Solver('lenet_solver1.prototxt');
结果,
Cleared 0 solvers and 0 stand-alone nets
显示一下,
>> solver solver = Solver (带属性): net: [1x1 caffe.Net] test_nets: [1x1 caffe.Net]
训练模型
一次性训练模型
solver.solve();
运行以后matlab跟待机一样,啥输出都没。显示正忙。。。
还以为出错,分析上面solver读取的两个net:
模型的输入竟然是empty的,难道我们的lmdb数据没有读进去,然后尝试了leveldb,以及各种改leveldb的路径,比如添加“./”之类的,都不行。这时候便想到了一种可能性,模型载入是不读取数据的,只有在运行时候读取数据,但是solver的solve方法是一次性训练模型,没有任何输出,matlab可能已经在训练模型了。
而且这时候我的电脑风扇响得很厉害。。。一般来说这样的话就是在运行东西了。其实这时候我们还可以看一眼我们的任务管理器,按Ctrl+Shift+Esc,打开任务管理器,发现matlab确实在运行东西,
等待一段时间之后,果然在solver文件中的指定路径下看到了我们训练好的model。。。
snapshot_prefix: "mnist_data/lenet"
为了避免这些模型是用空数据训练的,使用mnist的classification_demo测试一下,竟然手写数字都分类正确,这样便验证了我们的想法:solver.solve()是一次性训练数据,不会附带任何输出,matlab表现会如死机了。
训练模型step-by-step
去官网找:Or train for only 1000 iterations(so that you can do something to its net before training more iterations) solver.step(1000); To get iteration number: iter = solver.iter();
ta表达的意思是我们可以用step命令设置每次训练多少次以后,可以干一下别的事情,然后再进行训练。。。
好,卡壳了,设置完毕step为1表示我们想在每一次迭代都取出loss和accuracy,但是然后呢?怎么继续训练?找了很多教程都是Python的,受次启发,以及反复看caffe的官网,发现:
net.blobs('data').set_data(data); net.forward_prefilled(); prob = net.blobs('prob').get_data();
给出的解释简单翻译一下是:
net.forward 函数接受n维的输入,输出output的blob的数据
net.forward_prefilled使用的则是使用在模型中已经存在的数据继续训练,并不接受任何输入,以及提供任何输出。
看完这两个解释,思考一下,用step设置训练1次停一下,那么我们的数据是否依旧在blob中存着呢?
【最开始想法】那么就可以使用net.forward_prefilled做继续训练的工作,尝试一下:
%训练 clear clc caffe.reset_all solver=caffe.Solver('lenet_solver1.prototxt'); loss=[]; accuracy=[]; for i=1:10000 disp('.') solver.step(1); iter=solver.iter(); solver.net.forward_prefilled end
【试验之后】按照上面的想法能训练,但是突然发现,为什么不要backward_prefilled呢?而且,去掉solver.net.forward_prefilled也能训练。应该是solver.step自动包含了forward和backward过程了,因此正式使用的训练代码是:
%训练 clear clc caffe.reset_all solver=caffe.Solver('lenet_solver1.prototxt'); loss=[]; accuracy=[]; for i=1:10000 disp('.') solver.step(1); iter=solver.iter(); end
接下来就是取出每次迭代的loss和accuracy了,想都不用想,用blob,为了训练快点,可以切换到GPU版本的caffe-windows,(我的显卡刚刚好不支持GPU三倍加速)代码如下:
clear clc close all format long %设置精度,caffe的损失貌似精度在小数点后面好几位 caffe.reset_all%重设网络,否则载入两个网络会卡住 solver=caffe.Solver('lenet_solver1.prototxt'); %载入网络 loss=[];%记录相邻两个loss accuracy=[];%记录相邻两个accuracy hold on%画图用的 accuracy_init=0; loss_init=0; for i=1:10000 solver.step(1);%每迭代一次就取一次loss和accuracy iter=solver.iter(); loss=solver.net.blobs('loss').get_data();%取训练集的loss accuracy=solver.test_nets.blobs('accuracy').get_data();%取验证集的accuracy %画loss折线图 x=[i-1,i]; y=[loss_init loss]; plot(x,y,'r-') drawnow loss_init=loss; end
要迭代10000次,每次画出loss,用CPU速度还是很慢的。。。这里截取了几张过程图,可以看到loss是没问题的,一直震荡下降。
为了避免训练错误,我们来测试一下:
E:\CaffeDev\caffe-master\Build\x64\Release\caffe.exe test --model=lenet_train_test1.prototxt -weights=mnist_data/lenet_iter_10000.caffemodel pause
读取日志文件的loss
如果使用的是dos窗口caffe -train命令训练,那么提取loss和accuracy就需要定向到caffe默认的日志文件去,找的方法很简单。在开机命令窗口输入%tmp%
按时间排序,找到最近的以caffe.exe开头的文件名称,用notepad++打开可以看到日志信息:
因为我的这里没有最近训练的记录,所以只说下方法···
读文件的方法有很多,我用正则表达式去匹配loss信息:
先将这个记录log的文件拷贝出来,
比如:
%my loss clear; clc; close all; train_log_file = 'caffe.exe.BINGO-PC.Bingo.log.INFO.20160924-193528.13464' ; train_interval = 100 ; test_interval = 500 ; [~, string_output] = dos(['type ' , train_log_file ]) ; pat='1 = .*? loss'; o1=regexp(string_output,pat,'start');%用'start'参数指定输出o1为匹配正则表达式的子串的起始位置 o2=regexp(string_output,pat,'end');%用'start'参数指定输出o1为匹配正则表达式的子串的结束位置 o3=regexp(string_output,pat,'match');%用'match'参数指定输出o2为匹配正则表达式的子串 loss=zeros(1,size(o1,2)); for i=1:size(o1,2) loss(i)=str2num(string_output(o1(i)+4:o2(i)-5)); end plot(loss)
运行:
相关文章推荐
- windows下运用matlab绘制caffe训练日志文件中的loss曲线
- caffe for windows的matlab接口(三):权重和特征图的可视化
- 用caffe训练完模型之后调用matlab接口直接进行测试,不用重新编写模型程序
- 深度学习Caffe实战(9)Windows 平台caffe用MATLAB接口实现训练网络和测试
- caffe 在windows系统下的配置,以及matlab接口配置
- 将caffe训练时loss的变化曲线用matlab绘制出来
- 【caffe-Windows】微软官方caffe之matlab接口配置,以及安装caffe的注意事项
- caffe for windows的matlab接口(四):权重和特征图可视化的一个例子
- caffe for windows的python接口学习(4):训练模型
- caffe保存训练输出到log 并绘制accuracy loss曲线以及ssd画loss和accuracy曲线
- 【caffe-matlab】使用matlab训练caffe及绘制loss
- caffe for windows 训练cifar10
- caffe for windows 实现cifar10图像训练生成caffemodel
- caffe训练灰度图像的时候识别率很高,但是在使用matlab接口重新测试的时候识别率却很低?
- caffe-windows 运行matlab 接口的例子
- 如何快糙好猛地在Windows下编译CAFFE并使用其matlab和python接口
- caffe绘制训练过程的loss和accuracy曲线
- Windows下编译Caffe并编译Matlab接口
- caffe for windows 训练cifar10
- 如何快糙好猛地在Windows下编译CAFFE并使用其matlab和python接口