关于Matconvnet中模型发布与共享的思考
1. 前言
現階段還堅持使用Matconvnet工具箱的一定是MATLAB的死粉。與TensorFlow、Keras相比,matconvnet的便捷性不夠。但是,matlab與matconvnet提供了良好的交互調試功能,使得算法開發可以非常迅速得到驗證。對于一個訓練好的模型,如何迅速的進行測試,這篇博客會開放我對這類問題的處理方法和代碼。
2. SimpleNN和 DagNN
參考:http://www.vlfeat.org/matconvnet/mfiles/+dagnn/@DagNN/DagNN/
接觸過SimpleNN的童鞋應該記得,SimpleNN是通過struct結構體進行構建的。所以在發布模型或者共享模型的時候可以直接將結構體進行發布,再利用vl_simpnn進行評估就好了。
后來由于Simplenn定義太隨性,使得代碼非常容易出錯。我講的隨性不是靈活,而是結構極其松散。牛津團隊為了應付這個事,開始采用DagNN,也就是有向無環圖進行網絡的定義、訓練,但是沒有封裝一個更好的用于DagNN評估函數。因此,我們只能通過vl_simplenn進行模型評估。也就是說,我們需要將DagNN轉成SimpleNN,并去除掉損失函數層。下面開始詳細說明我探索出來的一種方法:
首先將網絡確定成DagNN類型:
net = dagnn.DagNN.loadobj(net) ; % 'struct' To 'dagnn'采用遍歷的方式進行信息提取:
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很多同學問我,為什么要將訓練好的模型轉成DagNN之后,在進行網絡層和網絡參數提取。這是因為我需要用DagNN封轉好的一些函數,如getParamIndex()簡化流程。
一旦訓練好的網絡得到了如上處理就可以直接用于測試。測試函數為:
res = vl_simplenn(net, instance)這里需要注意兩點: instance要求為single類型;我們需要用gpuArray(instance)將待測試數據放入到GPU中。
3. vl_simplenn解析
在使用vl_simplenn進行模型性能評估之前,我們都會進行如下操作:
net = vl_simplenn_tidy(net) % matconvnet的版本適應性 res = vl_simplenn(net, inputdata)http://www.vlfeat.org/matconvnet/mfiles/simplenn/vl_simplenn/
總結
以上是生活随笔為你收集整理的关于Matconvnet中模型发布与共享的思考的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用VC写Assembly代码(1)
- 下一篇: 利用MatConvNet进行孪生多分支网