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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2025/3/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于Matconvnet中模型发布与共享的思考 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。