关于Matconvnet中模型发布与共享的思考
1. 前言
現(xiàn)階段還堅(jiān)持使用Matconvnet工具箱的一定是MATLAB的死粉。與TensorFlow、Keras相比,matconvnet的便捷性不夠。但是,matlab與matconvnet提供了良好的交互調(diào)試功能,使得算法開(kāi)發(fā)可以非常迅速得到驗(yàn)證。對(duì)于一個(gè)訓(xùn)練好的模型,如何迅速的進(jìn)行測(cè)試,這篇博客會(huì)開(kāi)放我對(duì)這類(lèi)問(wèn)題的處理方法和代碼。
2. SimpleNN和 DagNN
參考:http://www.vlfeat.org/matconvnet/mfiles/+dagnn/@DagNN/DagNN/
接觸過(guò)SimpleNN的童鞋應(yīng)該記得,SimpleNN是通過(guò)struct結(jié)構(gòu)體進(jìn)行構(gòu)建的。所以在發(fā)布模型或者共享模型的時(shí)候可以直接將結(jié)構(gòu)體進(jìn)行發(fā)布,再利用vl_simpnn進(jìn)行評(píng)估就好了。
后來(lái)由于Simplenn定義太隨性,使得代碼非常容易出錯(cuò)。我講的隨性不是靈活,而是結(jié)構(gòu)極其松散。牛津團(tuán)隊(duì)為了應(yīng)付這個(gè)事,開(kāi)始采用DagNN,也就是有向無(wú)環(huán)圖進(jìn)行網(wǎng)絡(luò)的定義、訓(xùn)練,但是沒(méi)有封裝一個(gè)更好的用于DagNN評(píng)估函數(shù)。因此,我們只能通過(guò)vl_simplenn進(jìn)行模型評(píng)估。也就是說(shuō),我們需要將DagNN轉(zhuǎn)成SimpleNN,并去除掉損失函數(shù)層。下面開(kāi)始詳細(xì)說(shuō)明我探索出來(lái)的一種方法:
首先將網(wǎng)絡(luò)確定成DagNN類(lèi)型:
net = dagnn.DagNN.loadobj(net) ; % 'struct' To 'dagnn'采用遍歷的方式進(jìn)行信息提取:
function simple_net = deployNet(net) input = 'target'; output = 'block3x'; simple_net = []; simple_net.layers = []; simple_net.meta = net.meta;while ~strcmp(input,output)for i = 1:numel(net.layers)if numel(net.layers(i).inputs) == 1 && strcmp(net.layers(i).inputs{1},input)input = net.layers(i).outputs{1};if isa(net.layers(i).block,'dagnn.Conv')simple_net.layers{end+1} = struct(...'name', net.layers(i).name, ...'type', 'conv', ...'weights', {{net.params(net.getParamIndex(net.layers(i).params{1,1})).value,...net.params(net.getParamIndex(net.layers(i).params{1,2})).value}}, ...'pad', net.layers(i).block.pad, ...'stride', net.layers(i).block.stride,...'dilate',net.layers(i).block.dilate) ;elseif isa(net.layers(i).block,'dagnn.ReLU')simple_net.layers{end+1} = struct(...'name', deal(net.layers(i).name), ...'type', 'relu') ;elseif isa(net.layers(i).block,'dagnn.Pooling')simple_net.layers{end+1} = struct(...'name', deal(net.layers(i).name), ...'method',deal(net.layers(i).block.method),...'pool', deal(net.layers(i).block.poolSize),...'stride',deal(net.layers(i).block.stride),...'pad', deal(net.layers(i).block.pad),...'type', 'pool');elseif isa(net.layers(i).block,'dagnn.LRN')simple_net.layers{end+1} = struct(...'name', deal(net.layers(i).name), ...'type', 'lrn',...'param',net.layers(i).block.param) ;elseerror('No such layer!');endcontinue;endend end很多同學(xué)問(wèn)我,為什么要將訓(xùn)練好的模型轉(zhuǎn)成DagNN之后,在進(jìn)行網(wǎng)絡(luò)層和網(wǎng)絡(luò)參數(shù)提取。這是因?yàn)槲倚枰肈agNN封轉(zhuǎn)好的一些函數(shù),如getParamIndex()簡(jiǎn)化流程。
一旦訓(xùn)練好的網(wǎng)絡(luò)得到了如上處理就可以直接用于測(cè)試。測(cè)試函數(shù)為:
res = vl_simplenn(net, instance)這里需要注意兩點(diǎn): instance要求為single類(lèi)型;我們需要用gpuArray(instance)將待測(cè)試數(shù)據(jù)放入到GPU中。
3. vl_simplenn解析
在使用vl_simplenn進(jìn)行模型性能評(píng)估之前,我們都會(huì)進(jìn)行如下操作:
net = vl_simplenn_tidy(net) % matconvnet的版本適應(yīng)性 res = vl_simplenn(net, inputdata)http://www.vlfeat.org/matconvnet/mfiles/simplenn/vl_simplenn/
總結(jié)
以上是生活随笔為你收集整理的关于Matconvnet中模型发布与共享的思考的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 用VC写Assembly代码(1)
- 下一篇: 利用MatConvNet进行孪生多分支网