日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/3/15 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于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中模型发布与共享的思考的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。