导入预训练的ONNX网络作为函数
导入一个ONNX™ (开放式神经网络交换)网络文件参数个数
=importonxfunction(modelfile
,网络函数名
)modelfile
并返回一个ONNXParameters
对象(参数个数
),包含网络参数。该函数还创建一个模型函数,其名称为网络函数名
包含网络体系结构的。有关网络功能的更多信息,请参阅导入的ONNX模型函数.
使用ONNXParameters
对象和对象网络函数名
模型函数执行常见的深度学习任务,如图像和序列数据分类、迁移学习、目标检测和图像分割。importONNXFunction
当您无法使用该网络时导入网络时很有用importonnxnetwork.
函数(例如,importONNXFunction
可以导入YOLOv3),或者如果您想定义自己的自定义培训循环(有关更多详细信息,请参阅使用自定义训练循环的训练网络).
此函数需要ONNX模型格式的深度学习工具箱™转换器金宝app支持包。如果未安装此支持金宝app包,则该函数提供了下载链接。
导入ONNX网络作为函数。该网络包含深度学习工具箱层不支持的ONNX操作符。金宝app您可以将导入的模型函数用于深度学习任务,如预测和迁移学习。
下载并安装ONNX模型格式支持包的深入学习工具箱转换器。您可以输入金宝appimportONNXFunction
在命令行中检查支持包是否已安装。金宝app如果没有安装,则该函数将提供到Add-On Explorer中所需的支持包的链接。金宝app要安装支持包,请单击链接,然后金宝app单击安装.
指定要导入的文件为shufflenet
使用ONNX模型动物园中的操作符设置9。shufflenet
是一种卷积神经网络,可在ImageNet数据库中培训。
模型文件=“shufflenet-9.onnx”;
推荐的做法是尝试通过使用importonnxnetwork.
.如果importonnxnetwork.
无法导入网络,因为某些网络层不受支持,您可以使用将网络作为层导入金宝app重要人物
,或作为一个函数使用importONNXFunction
.
导入shufflenet
网络层。该软件生成占位符层来代替不支持的层。金宝app
lgraph = importONNXLayers (modelfile,“OutputLayerType”,'分类');
警告:无法导入一些ONNX运算符,因为它们不受支持。金宝app他们已被占位符层所取代。要查找这些图层,请在返回的对象上调用FindPlaceHolderLayers。4运算符:ONNX文件中的平均池池层不包括平均填充。这可能会在ONNX和MATLAB网络输出之间造成小的数值差异。32个操作员:只有在执行平整操作时才支持重塑操作符。金宝app16运算符:不支持操作员“转置”。金宝app将ONNX网络作为函数导入,可以支持大多数ONNX运算符,调用importonnxfunction。金宝app
查找占位符层并显示占位符层的数量。
indPlaceholderLayers = findPlaceholderLayers (lgraph);元素个数(indPlaceholderLayers)
ans = 48
必须替换要使用的48个占位符层LGRAPH.
用于深度学习任务,如预测。
相反,将网络作为函数导入,以生成一个模型函数,您可以轻松地将其用于深度学习任务。
params = importONNXFunction (modelfile,'shufflenetfcn')
一个包含导入的ONNX网络的函数'shufflenetFcn'已经保存到当前目录。要学习如何使用这个函数,输入:help shufflenetFcn
params = ONNXParameters with properties: Learnables: [1×1 struct] Nonlearnables: [1×1 struct] State: [1×1 struct] NumDimensions: [1×1 struct] NetworkFunctionName: 'shufflenetFcn'
importONNXFunction
返回ONNXParameters
对象参数个数
,包含网络参数和模型函数shufflnetFcn
,其中包含网络体系结构。importONNXFunction
节省了Shufflenetfcn.
在当前文件夹中。使用命令可以打开模型函数查看或编辑网络架构打开shufflenetFcn
.
导入一个ONNX网络作为函数,使用预先训练好的网络来预测输入图像的类标签。
指定要导入的文件为shufflenet
使用ONNX模型动物园中的操作符设置9。shufflenet
是一个卷积神经网络,训练了来自ImageNet数据库的100多万张图像。因此,该网络学习了丰富的特征表示范围广泛的图像。该网络可以将图像分为1000个对象类别,如键盘、鼠标、铅笔和许多动物。
模型文件=“shufflenet-9.onnx”;
使用导入预训练的ONNX网络作为函数importONNXFunction
,它返回ONNXParameters
对象参数个数
.此对象包含网络参数。该函数还在包含网络架构的当前文件夹中创建了一个新的模型函数。指定模型函数的名称Shufflenetfcn.
.
params = importONNXFunction (modelfile,'shufflenetfcn');
已将包含导入的ONNX网络的函数保存到shuffle .m文件中。要学习如何使用这个函数,输入:help shufflenetFcn。
阅读你想分类的图像,并显示图像的大小。图像是792 × 1056像素,有三个颜色通道(RGB)。
I=imread('孔雀.jpg'); 尺寸(I)
ans =1×3.792 1056 3
将图像调整为网络的输入大小。显示图像。
I = imresize(I,[224 224]);imshow(我)
输入到shufflenet
需要进一步的预处理(有关更多详细信息,请参阅ONNX模型动物园中的ShuffleNet).重新调节图像。对图像进行归一化,方法是减去训练图像的均值并除以训练图像的标准差。
I=重新缩放(I,0,1);平均值=[0.485 0.456 0.406];标准差分=[0.229 0.224 0.225];I=(I-重塑(平均值,[1-13])。/重塑(标准差分,[1-13]);显示(I)
从其中导入类名挤压网
,它也使用来自ImageNet数据库的图像进行训练。
网= squeezenet;一会= net.Layers .ClassNames(结束);
通过指定要分类的图像来计算类概率我
和ONNXParameters
对象参数个数
作为模型函数的输入参数Shufflenetfcn.
.
分数=fcn(I,参数);
找到概率最高的类索引。显示输入图像的预测类和相应的分类得分。
indMax =找到(分数= = max(分数));类名(indMax)
ans =1×1单元阵列{'孔雀'}
scoreMax =分数(indMax)
scoreMax = 0.7517
导入挤压网
将卷积神经网络作为函数,用迁移学习对预先训练好的网络进行微调,对新的图像集合进行分类。
这个例子使用了几个辅助函数。要查看这些函数的代码,请参见辅助函数.
解压缩并将新图像加载为图像数据存储。图像数据存储
自动标签的图像基于文件夹名称和存储数据作为ImageDatastore
对象。映像数据存储使您能够存储大图像数据,包括不适合内存的数据,并在卷积神经网络的训练期间有效地读取批次图像。指定迷你批次大小。
解压缩(“MerchData.zip”);miniBatchSize = 8;imd = imageDatastore (“MerchData”,...“IncludeSubfolders”,真的,...“LabelSource”,'foldernames',...“ReadSize”, miniBatchSize);
这个数据集很小,只包含75张训练图像。显示一些示例图像。
numImages =元素个数(imds.Labels);idx = randperm (numImages 16);数字为i = 1:16 subplot(4,4,i) i = readimage(imds,idx(i));imshow(我)结束
提取训练集,对分类标签进行一次性编码。
XTrain=readall(imds);XTrain=单个(类别(4,XTrain{:}));YTrain_categ=分类(imds.标签);YTrain=一个热编码(YTrain_categ,2)';
确定数据中类的数量。
类=类别(YTrain_categ);numClasses =元素个数(类)
numClasses = 5
挤压网
是一个卷积神经网络,训练了来自ImageNet数据库的100多万张图像。因此,该网络学习了丰富的特征表示范围广泛的图像。该网络可以将图像分为1000个对象类别,如键盘、鼠标、铅笔和许多动物。
进口净化挤压网
网络是一种功能。
println () params = importONNXFunction(“squeezenet.onnx”,“squeezenetFcn”)
已将包含导入的ONNX网络的函数保存到文件squeezenetFcn.m中。要学习如何使用这个功能,输入:help squeezenetFcn。
params=ONNXParameters,属性为:Learnables:[1×1结构]Nonlearnables:[1×1结构]状态:[1×1结构]NumDimensions:[1×1结构]网络函数名:'squeezenetFcn'
参数个数
是一个ONNXParameters
对象,该对象包含网络参数。squeezenetFcn
是一个包含网络架构的模型功能。importONNXFunction
节省了squeezenetFcn
在当前文件夹中。
计算新训练集上预训练网络的分类精度。
AccuracyBeforTraining=GetNetworkAccurance(XTrain、YTrain、params);fprintf(' %。2f accuracy before transfer learning\n',准确度(再培训前);
0.01迁移学习前的准确度
精度非常低。
通过输入显示可学习的网络参数可学参数
.这些参数,例如权重(W
)及偏见(B
)卷积和完全连接的图层,在培训期间由网络更新。在培训期间,非可爱参数保持不变。
预训练网络的最后两个可学习参数配置为1000类。
conv10_W:(1×1×512×1000 dlarray]
conv10_B(1000×1 dlarray):
参数conv10_W
和conv10_B
必须针对新的分类问题进行微调。通过初始化参数,将参数转换为对五个类进行分类。
params.Learnables.conv10_w = rand(1,1,512,5);params.Learnables.conv10_b = rand(5,1);
冻结网络的所有参数将它们转换为非可爱参数。因为您不需要计算冻结层的渐变,所以冻结许多初始层的重量可以显着加速网络训练。
参数=冻结参数(参数,“所有”);
解冻网络的最后两个参数,将其转换为可学习的参数。
Params = Unfreezeparameters(Params,“conv10_W”);Params = Unfreezeparameters(Params,“conv10_B”);
现在网络已经为培训做好了准备。初始化培训进度图。
情节=“培训 - 进展”;如果情节= =“培训 - 进展”figure lineLossTrain=animatedline;xlabel(“迭代”)ylabel(“损失”)结束
指定培训选项。
速度= [];numEpochs = 5;miniBatchSize = 16;numObservations =大小(YTrain, 2);numIterationsPerEpoch =地板(numObservations. / miniBatchSize);initialLearnRate = 0.01;动量= 0.9;衰变= 0.01;
培训网络。
迭代=0;开始=tic;executionEnvironment=“cpu”;%将“gpu”改为在gpu上训练。%循环纪元。为epoch = 1:numepochs%洗牌数据。idx = randperm(numobservations);XTrain = XTrain(:,:,idx);YTrain = YTrain(:,IDX);%在小批量上循环。为i = 1:numIterationsPerEpoch iteration = iteration + 1;%读取小批数据。idx=(i-1)*miniBatchSize+1:i*miniBatchSize;X=XTrain(:,:,:,idx);Y=YTrain(:,idx);%如果在GPU上进行训练,则将数据转换为gpuArray。如果(b)执行环境==“汽车”&& canUseGPU) || executionEnvironment ==“GPU”X = gpuArray (X);结束%使用dlfeval和dlfeval评估模型渐变和损失%模型梯度函数。[渐变,损失,状态] = DLFeval(@ Maposgradients,X,Y,Params);params.state =州;%确定基于时间的衰减学习率计划的学习率。learnRate=初始learnRate/(1+衰减*迭代);%使用SGDM优化器更新网络参数。(参数。可学的,速度]= sgdmupdate (params.Learnables、渐变速度);%显示训练进度。如果情节= =“培训 - 进展”D =持续时间(0,0,toc(开始),“格式”,“hh: mm: ss”);添加点(lineLossTrain、迭代、双(聚集(提取数据(丢失)))标题(“时代:”+时代+”,过去:“+ drawnow字符串(D))结束结束结束
微调后计算网络的分类准确性。
accuracyAfterTraining = getNetworkAccuracy (XTrain、YTrain params);流(' %。2f accuracy after transfer learning\n', accuracyAfterTraining);
迁移学习后的准确性
辅助函数
本节提供本示例中使用的helper函数的代码。
的getNetworkAccuracy
函数通过计算分类精度来评估网络性能。
函数= getNetworkAccuracy(X,Y,onnxParams) N = size(X,4);onnxParams Ypred = squeezenetFcn (X,“培训”、假);[~, YIdx] = max (Y, [], 1);[~, YpredIdx] = max (Ypred [], 1);numIncorrect = sum(abs(YIdx-YpredIdx) > 0); / /输出精度= 1 - numIncorrect/N;结束
的模型梯度
函数计算损失和梯度。
函数[grad, loss, state] = modelGradients(X,Y,onnxParams)“培训”,真正的);损失= crossentropy (y y“数据格式”,'cb'); 梯度=dlgradient(损失,onnxParams.Learnables);结束
的squeezenetONNX
的ONNX模型挤压网
网络。
函数挤压网络NX()导出网络NX(挤压网络,“squeezenet.onnx”);结束
导入ONNX长短期记忆(LSTM)网络作为函数,使用预先训练好的网络对序列数据进行分类。LSTM网络允许您将序列数据输入到网络中,并根据序列数据的单个时间步长进行预测。
这个例子使用了helper函数准备分子
.要查看此函数的代码,请参见Helper函数.
lstmNet
具有与中创建的LSTM网络类似的体系结构使用深度学习序列分类.lstmNet
训练识别说话人给定的时间序列数据,表示连续说出的两个日语元音。培训数据包含九位发言者的时间序列数据。每个序列有12个特征,长度各不相同。
指定lstmNet
作为模型文件。
模型文件='lstmNet.onnx';
使用导入预训练的ONNX网络作为函数importONNXFunction
,它返回ONNXParameters
对象参数个数
包含网络参数。该函数还在包含网络架构的当前文件夹中创建了一个新的模型函数。指定模型函数的名称lstmnetfcn.
.
params = importONNXFunction (modelfile,“lstmnetFcn”);
已将包含导入的ONNX网络的函数保存到文件lstmnetFcn.m。要学习如何使用这个函数,输入:help lstmnetFcn。
加载日语元音测试数据。XTest.
是一个单元格数组,包含370个长度为12的序列。欧美
为标签“1”,“2”,…“9”,对应9个发言者。
[XTest,YTest]=日本世界统计数据;
lstmNet
使用序列长度相似的小批量进行训练。要以同样的方式组织测试数据,请按序列长度对测试数据进行排序。
numObservationsTest=numel(XTest);为i = 1:numobservationstest序列= xtest {i};SequenceLengdentStest(i)=大小(序列,2);结束[sequenceLengthsTest, idx] = (sequenceLengthsTest)进行排序;XTest = XTest (idx);欧美=欧美(idx);
使用准备分子
来计算排列向量inputPerm
,将输入序列数据的维度顺序排列为导入的LSTM网络输入的维度顺序。你可以打字帮助lstmnetFcn
查看网络输入的维度顺序序列输入
.
inputPerm = preparePermutationVector ([“特征长度”,“SequenceLength”,“批量化”],...[“SequenceLength”,“批量化”,“特征长度”]);
通过指定序列数据来分类来计算类概率XTest.
和ONNXParameters
对象参数个数
作为模型函数的输入参数lstmnetfcn.
.通过赋值数字向量自定义输入维度顺序inputPerm
到名称值参数“InputDataPermutation”
.返回得分
在网络输出的维度排序中,通过指定“没有”
到名称值参数“OutputDataPermutation”
.
为i = 1:length(XTest) scores = lstmnetFcn(XTest{i},params,“InputDataPermutation”,inputPerm,“OutputDataPermutation”,“没有”);YPred(i)=查找(分数==最大分数);结束ypred =分类(ypred');
计算预测的分类精度。
acc=sum(YPred==YTest)。/numel(YTest)
acc = 0.9514
Helper函数
本节提供帮助器函数的代码准备分子
在这个例子中使用。
的准备分子
函数返回一个排列向量烫
,它在中排列维度顺序fromDimOrder
到中的维度排序toDimOrder
.您可以指定输入参数fromDimOrder
和toDimOrder
例如字符向量、字符串标量、字符串数组、字符向量的单元格数组或数字向量。两个参数必须具有相同的类型和相同的唯一元素。例如,如果fromDimOrder
为字符向量“hwcn”
,toDimOrder
可以是字符向量吗“nchw”
(在哪里h
,w
,c
分别对应图像的高度、宽度和通道数量,和n
为观测次数)。
函数perm=preparePermutationVector(从DIMORDER到IMORDER)%检查fromDimOrder和toDimOrder是否都是向量。如果~isvector(fromDimOrder) || ~isvector(toDimOrder) error(message()“nnet_cnn_onnx: onnx: FPVtypes”));结束%从dimorder和toDimOrder转换为适当的类型。如果Isstring(fromDimorder)&& iscoalar(fromdimorder)fromdimorder = char(fromdimorder);结束如果isstring(toDimOrder) && isscalar(toDimOrder) toDimOrder = char(toDimOrder);结束%检查vervimorder和todimorder是否具有唯一的元素。[fromSorted,ifrom]=唯一(fromDimOrder);[toSorted,~,Itoiv]=唯一(toDimOrder);如果numel(fromDimOrder) ~= numel(fromDimOrder) error(message())'nnet_cnn_onnx:onnx:fpvfromunique'));结束如果numel(toDimOrder) ~= numel(toDimOrder) error(message())“nnet_cnn_onnx: onnx: FPVtounique”));结束%检查fromDimOrder和toDimOrder的元素数是否相同。如果~isequal(从排序到排序)错误(消息(“nnet_cnn_onnx: onnx: FPVsame”));结束计算排列向量。ifrom烫= (iToInv);烫=烫发(:)”;结束
modelfile
- - - - - -ONNX模型文件的名称包含网络的ONNX模型文件的名称,指定为字符向量或字符串标量。该文件必须位于当前文件夹或MATLAB上的文件夹中®路径,否则必须包含文件的完整路径或相对路径。
例子:“shufflenet.onnx”
网络函数名
- - - - - -模型函数的名称模型函数的名称,指定为字符向量或字符串标量。功能网络函数名
包含导入的ONNX网络的体系结构。该文件保存在当前文件夹中的M文件中,或者您必须包含文件的完整或相对路径。的网络函数名
文件是使用网络所必需的。有关更多信息,请参见导入的ONNX模型函数.
例子:'shufflenetfcn'
参数个数
——网络参数ONNXParameters
对象网络参数,作为ONNXParameters
对象。参数个数
包含导入的ONNX模型的网络参数。使用点表示法引用的属性参数个数
.例如,可学参数
显示网络可学习参数,如卷积层的权重。
importONNXFunction
金宝app支持这些ONNX版本:
ONNX中间表示版本6
ONNX操作符将7设置为13
importONNXFunction
创建一个模型函数,该函数包含导入的ONNX模型的网络架构。指定名称网络函数名
作为一个输入论点importONNXFunction
.
使用以下语法与导入的ONNX模型函数(网络函数名
):
[Y,状态]= NetworkFunctionName (X,
返回输出数据参数个数
)Y
以及更新后的网络状态
输入数据X
.
[Y,状态]= NetworkFunctionName (X,
使用由一个或多个名称-值对参数指定的附加选项。参数个数
,名称,值)
(Y1, Y2,…,Yn,状态] = NetworkFunctionName(X1,X2,...,Xn,
返回多个输出数据(参数个数
)Y1, Y2,…,Yn
)和更新的网络状态
对于多个输入数据(X1, X2,…,Xn
).
(Y1, Y2,…,Yn,状态] = NetworkFunctionName(X1,X2,...,Xn,
使用一个或多个名称 - 值对参数指定的其他选项进行多个输入和输出。参数个数
,名称,值)
论点 | 描述 |
---|---|
X |
输入数据,指定为数组或dlarray . |
参数个数 |
网络参数,指定为ONNXParameters 对象。 |
参数名称 | 描述 |
---|---|
“培训” |
培训选项,指定为
|
“InputDataPermutation” |
应用于输入维度排序的排列 为名称-值对参数赋值
|
“OutputDataPermutation” |
用于输出维数排序的排列 为名称-值对参数赋值
|
论点 | 描述 |
---|---|
Y |
输出数据,作为数组返回
|
状态 |
更新的网络状态,指定为结构。 网络 |
输入论元的解释X
和输出参数Y
模型之间可能有所不同。有关模型输入和输出参数的更多信息,请参阅帮助
用于导入的模型函数网络函数名
,或参考ONNX文档[1].
默认情况下,网络函数名
自动排列输入和输出数据,以便于执行图像分类任务。自动排列可能不适用于其他任务,如目标检测和时间序列分类。
自动释放输入,网络函数名
基于导入的Onnx网络指定的输入维度假设以下内容。
ONNX模型输入尺寸的数量 | 输入数据的解释 | ONNX标准尺寸排序 | 深度学习工具箱标准维度排序 | 输入的自动排列 |
---|---|---|---|---|
4 | 2-D图像 |
|
|
[4 3 1 2] |
如果输入的尺寸不是4,网络函数名
指定输入参数“InputDataPermutation”
作为“没有”
.
要自动排列输出,网络函数名
基于导入的ONNX网络指定的输出维度,假设以下内容。
ONNX模型输出尺寸的数量 | 输出数据的解释 | ONNX标准尺寸排序 | 深度学习工具箱标准维度排序 | 输出自动排列 |
---|---|---|---|---|
2 | 二维图像分类分数 |
|
|
[2 1] |
4 | 二维图像像素分类评分 |
|
|
[3 4 2 1] |
如果输出尺寸的大小不是2或4,网络函数名
指定输入参数“OutputDataPermutation”
作为“没有”
.
importONNXFunction
金宝app支持importONNXFunction
金宝app支持以下ONNX运算符,但有一些限制。请将这些运算符与支持的运算符进行比较importonnxnetwork.
和重要人物
用于转换成等效的内置MATLAB层。
ONNX操作符金宝appimportONNXFunction |
importonnxnetwork. 和重要人物 金宝app |
---|---|
腹肌 |
不 |
|
是的 |
和 |
不 |
argmax. |
不 |
|
是的 |
|
是的 |
铸造 |
不 |
装天花板 |
不 |
|
是的 |
压紧 |
不 |
|
是的 |
|
是的 |
ConstantOfShape |
不 |
|
是的 |
|
是的 |
DepthToSpace |
是的 |
|
是的 |
|
是的 |
相同的 |
不 |
exp. |
不 |
扩张 |
不 |
|
是的 |
地板 |
不 |
收集 |
不 |
|
是的 |
|
是的 |
|
是的 |
Hardmax |
不 |
|
是的 |
如果 |
不 |
InstanceNormalization |
是的 |
|
是的 |
少 |
不 |
LessOrEqual |
不 |
日志 |
不 |
循环 |
不 |
|
是的 |
|
是的 |
|
是的 |
|
是的 |
|
是的 |
负的 |
不 |
非轴抑制 |
不 |
非零 |
不 |
不 |
不 |
OneHot |
不 |
或者 |
不 |
垫 |
不 |
鲍 |
不 |
|
是的 |
RandomUniform |
不 |
范围 |
不 |
互惠的 |
不 |
ReduceMax |
不 |
ReduceMean |
不 |
reducemin |
不 |
还原柱 |
不 |
重新介绍 |
不 |
|
是的 |
|
是的 |
调整 |
是的 |
RoiAlign |
不 |
圆形的 |
不 |
扫描 |
不 |
分散 |
不 |
ScatterElements |
不 |
SequenceAt |
不 |
形状 |
不 |
|
是的 |
片 |
不 |
|
是的 |
SpaceToDepth |
是的 |
分裂 |
不 |
劈裂 |
不 |
√6 |
不 |
挤压 |
不 |
|
是的 |
|
是的 |
|
是的 |
瓷砖 |
不 |
TopK |
不 |
转置 |
不 |
Unsqueeze |
不 |
Upsample |
不 |
在哪里 |
不 |
importONNXFunction
当无法使用导入预训练的ONNX网络时,此选项非常有用importonnxnetwork.
.如果您想为预先训练的网络生成代码,请使用重要人物
.使用。查找并替换生成的占位符层findPlaceholderLayers
和replaceLayer
,分别。然后,用装配网络
返回一个Dagnetwork.
对象。你可以为训练有素的人生成代码Dagnetwork.
.有关最适合不同场景的导入函数的更多信息,请参见选择要导入Onnx预磨损网络的功能.
你点击一个链接对应于这个MATLAB命令:
通过在MATLAB命令窗口中输入命令来运行命令。Web浏览器不支持MATLAB命令。金宝app
你也可以从以下列表中选择一个网站:
选择中国网站(中文或英文)以获得最佳网站性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。