关于Matconvnet中模型发布与共享的思考

关于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' 

采用遍历的方式进行信息提取:

 
  1. function simple_net = deployNet(net)

  2. input = 'target';

  3. output = 'block3x';

  4. simple_net = [];

  5. simple_net.layers = [];

  6. simple_net.meta = net.meta;

  7.  
  8. while ~strcmp(input,output)

  9. for i = 1:numel(net.layers)

  10. if numel(net.layers(i).inputs) == 1 && strcmp(net.layers(i).inputs{1},input)

  11. input = net.layers(i).outputs{1};

  12. if isa(net.layers(i).block,'dagnn.Conv')

  13. simple_net.layers{end+1} = struct(...

  14. 'name', net.layers(i).name, ...

  15. 'type', 'conv', ...

  16. 'weights', {{net.params(net.getParamIndex(net.layers(i).params{1,1})).value,...

  17. net.params(net.getParamIndex(net.layers(i).params{1,2})).value}}, ...

  18. 'pad', net.layers(i).block.pad, ...

  19. 'stride', net.layers(i).block.stride,...

  20. 'dilate',net.layers(i).block.dilate) ;

  21. elseif isa(net.layers(i).block,'dagnn.ReLU')

  22. simple_net.layers{end+1} = struct(...

  23. 'name', deal(net.layers(i).name), ...

  24. 'type', 'relu') ;

  25. elseif isa(net.layers(i).block,'dagnn.Pooling')

  26. simple_net.layers{end+1} = struct(...

  27. 'name', deal(net.layers(i).name), ...

  28. 'method',deal(net.layers(i).block.method),...

  29. 'pool', deal(net.layers(i).block.poolSize),...

  30. 'stride',deal(net.layers(i).block.stride),...

  31. 'pad', deal(net.layers(i).block.pad),...

  32. 'type', 'pool');

  33. elseif isa(net.layers(i).block,'dagnn.LRN')

  34. simple_net.layers{end+1} = struct(...

  35. 'name', deal(net.layers(i).name), ...

  36. 'type', 'lrn',...

  37. 'param',net.layers(i).block.param) ;

  38. else

  39. error('No such layer!');

  40. end

  41. continue;

  42. end

  43. end

  44. end

很多同学问我,为什么要将训练好的模型转成DagNN之后,在进行网络层和网络参数提取。这是因为我需要用DagNN封转好的一些函数,如getParamIndex()简化流程。

一旦训练好的网络得到了如上处理就可以直接用于测试。测试函数为:

res = vl_simplenn(net, instance)

这里需要注意两点: instance要求为single类型;我们需要用gpuArray(instance)将待测试数据放入到GPU中。

3. vl_simplenn解析

在使用vl_simplenn进行模型性能评估之前,我们都会进行如下操作:

 
  1. net = vl_simplenn_tidy(net) % matconvnet的版本适应性

  2. res = vl_simplenn(net, inputdata)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值