导入预训练的ONNX网络作为函数
从文件中导入ONNX™(Open Neural Network Exchange)网络参数个数
= importONNXFunction (modelfile
,NetworkFunctionName
)modelfile
并返回一个ONNXParameters
对象(参数个数
),包含网络参数。该函数还创建一个模型函数,其名称为NetworkFunctionName
包含网络架构。有关网络功能的详细信息,请参阅导入ONNX模型函数.
使用ONNXParameters
对象和NetworkFunctionName
模型函数执行常见的深度学习任务,如图像和序列数据分类、迁移学习、目标检测和图像分割。importONNXFunction
在无法使用importONNXNetwork
函数(例如,importONNXFunction
可以导入YOLOv3),或者如果您想定义自己的自定义训练循环(更多细节,参见使用自定义训练循环训练网络).
此函数需要ONNX模型格式的深度学习工具箱™转换器万博1manbetx支持包。如果没有安装此支万博1manbetx持包,则该函数将提供下载链接。
导入ONNX网络作为函数。该网络包含深度学习工具箱层不支持的ONNX操作符。万博1manbetx您可以将导入的模型函数用于深度学习任务,如预测和迁移学习。
下载并安装ONNX模型格式支持包的深度学习工具箱转换器。万博1manbetx您可以输入importONNXFunction
在命令行中检查支持包是否已安装。万博1manbetx如果没有安装,则该函数将提供到Add-On Explorer中所需的支持包的链接。万博1manbetx要安装支持包,请单击链接,然后万博1manbetx单击安装.
指定要导入的文件为shufflenet
使用ONNX模型动物园中的操作符设置9。shufflenet
是一个卷积神经网络,它根据来自ImageNet数据库的图像进行训练。
modelfile =.“shufflenet - 9. onnx”;
推荐的做法是尝试通过使用importONNXNetwork
.如果importONNXNetwork
无法导入网络,因为不支持某些网络图层,您可以通过使用将网络作为图层导入万博1manbetximportONNXLayers
,或作为一个函数使用importONNXFunction
.
导入shufflenet
网络层。该软件生成占位符层来代替不支持的层。万博1manbetx
lgraph = importONNXLayers (modelfile,“OutputLayerType”,“分类”);
警告:无法导入一些ONNX操作符,因为它们不受支持。万博1manbetx它们已经被占位符层所取代。要查找这些层,调用返回对象上的函数findPlaceholderLayers。4个操作符:ONNX文件中的平均池层不包括填充。这可能会导致ONNX和MATLAB网络输出之间的小数值差异。32个操作符:只有在执行扁平化操作时才支持整形操作符。万博1manbetx16个操作符:不支持操作符'Transpose'。万博1manbetx要将ONNX网络作为一个函数导入,它可以支持大多数ONNX操作符,调用importONNXFunctio万博1manbetxn。
查找占位符层并显示占位符层的数量。
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个对象类别,如键盘、鼠标、铅笔和许多动物。
modelfile =.“shufflenet - 9. onnx”;
使用。导入预训练的ONNX网络作为函数importONNXFunction
,它返回ONNXParameters
对象参数个数
.该节点包含网络参数。该函数还在包含网络架构的当前文件夹中创建了一个新的模型函数。指定模型函数的名称为shufflenetFcn
.
params = importONNXFunction (modelfile,“shufflenetFcn”);
已将包含导入的ONNX网络的函数保存到shuffle .m文件中。要学习如何使用这个函数,输入:help shufflenetFcn。
阅读你想分类的图像,并显示图像的大小。图像是792 × 1056像素,有三个颜色通道(RGB)。
我= imread (“peacock.jpg”);尺寸(i)
ans =1×3792 1056 3
将图像的大小调整为网络的输入大小。显示图像。
I = imresize(I,[224 224]);imshow(我)
的输入shufflenet
需要进一步的预处理(更多细节,请参阅Shuffleenet在Onnx模型动物园).重新调节图像。对图像进行归一化,方法是减去训练图像的均值并除以训练图像的标准差。
I =重新调节(0,1);meanIm = [0.485 0.456 0.406];stdIm = [0.229 0.224 0.225];I = (I -重塑(meanIm,[1 1 3]))。/重塑(stdIm [1 1 3]);imshow(我)
从其中导入类名squeezenet
,它也使用来自ImageNet数据库的图像进行训练。
网= squeezenet;一会= net.Layers .ClassNames(结束);
通过指定要分类的图像来计算类概率我
和ONNXParameters
对象参数个数
作为模型函数的输入参数shufflenetFcn
.
成绩= shufflenetFcn(我params);
找到概率最高的类索引。显示输入图像的预测类和相应的分类得分。
indMax =找到(分数= = max(分数));类名(indMax)
ans =1×1个单元阵列{“孔雀”}
scoreMax =分数(indMax)
scoreMax = 0.7517
导入squeezenet
将卷积神经网络作为函数,用迁移学习对预先训练好的网络进行微调,对新的图像集合进行分类。
这个例子使用了几个辅助函数。要查看这些函数的代码,请参见辅助函数.
将新图像解压并作为图像数据存储加载。imageDatastore
自动标签的图像基于文件夹名称和存储数据作为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 (imd);XTrain =单(cat (4, XTrain {:}));YTrain_categ =分类(imds.Labels);YTrain = onehotencode (YTrain_categ, 2) ';
确定数据中类的数量。
类=类别(YTrain_categ);numClasses =元素个数(类)
numClasses = 5
squeezenet
是一个卷积神经网络,训练了来自ImageNet数据库的100多万张图像。因此,该网络学习了丰富的特征表示范围广泛的图像。该网络可以将图像分为1000个对象类别,如键盘、鼠标、铅笔和许多动物。
导入pretrainedsqueezenet
网络是一种功能。
println () params = importONNXFunction(“squeezenet.onnx”,“squeezenetFcn”)
已将包含导入的ONNX网络的函数保存到文件squeezenetFcn.m中。要学习如何使用这个功能,输入:help squeezenetFcn。
Nonlearnables: [1×1 struct] State: [1×1 struct] NumDimensions: [1×1 struct] NetworkFunctionName: 'squeezenetFcn'
参数个数
是一个ONNXParameters
包含网络参数的对象。squeezenetFcn
是一个包含网络架构的模型功能。importONNXFunction
节省了squeezenetFcn
在当前文件夹中。
计算新训练集上预训练网络的分类精度。
accuracyBeforeTraining = getNetworkAccuracy (XTrain、YTrain params);流(' %。2f accuracy before transfer learning\n', accuracyBeforeTraining);
转移学习前0.01精度
精度很低。
通过输入显示可学习的网络参数Params.Learnables.
.这些参数,例如权重(W
)及偏见(B
)的卷积层和全连接层,在训练时由网络更新。在训练过程中,不可学习的参数保持不变。
预磨损网络的最后两个可读参数配置为1000类。
conv10_W:(1×1×512×1000 dlarray]
conv10_B(1000×1 dlarray):
的参数conv10_W
和conv10_B
必须针对新的分类问题进行微调。通过初始化参数,将参数转换为5个类。
params.Learnables。conv10_W= rand(1,1,512,5); params.Learnables.conv10_B = rand(5,1);
冻结网络的所有参数,将它们转换为不可学习的参数。因为不需要计算冻结层的梯度,所以冻结许多初始层的权值可以显著加快网络训练。
params = freezeParameters (params,“所有”);
解冻网络的最后两个参数,将它们转换为可学习的参数。
params = unfreezeParameters (params,“conv10_W”);params = unfreezeParameters (params,“conv10_B”);
现在网络已经为培训做好了准备。初始化培训进度图。
情节=“训练进步”;如果情节= =“训练进步”figure lineLossTrain = animatedline;包含(“迭代”) ylabel (“损失”)结束
指定培训选项。
速度= [];numEpochs = 5;miniBatchSize = 16;numObservations =大小(YTrain, 2);numIterationsPerEpoch =地板(numObservations. / miniBatchSize);initialLearnRate = 0.01;动量= 0.9;衰变= 0.01;
培训网络。
迭代= 0;开始=抽搐;executionEnvironment =“cpu”;%将“gpu”改为在gpu上训练。%循环纪元。为时代= 1:numEpochs%洗牌数据。idx = randperm (numObservations);XTrain = XTrain (:,:,:, idx);YTrain = YTrain (:, idx);%循环小批。为i = 1:numIterationsPerEpoch iteration = iteration + 1;%读取小批数据。idx =(张)* miniBatchSize + 1:我* miniBatchSize;X = XTrain (:,:,:, idx);Y = YTrain (:, idx);%如果在GPU上训练,则将数据转换为gpuArray。如果(executionEnvironment = =“汽车”&& canUseGPU) || executionEnvironment ==“图形”X = gpuArray (X);结束使用dlfeval和%MACEMEGRADENTERS功能。(渐变、损失、状态)= dlfeval (@modelGradients, X, Y, params);参数个数。=状态;%确定基于时间的衰减学习率计划的学习率。learnRate = initialLearnRate/(1 +衰减*迭代);%使用SGDM优化器更新网络参数。(参数。可学的,速度]= sgdmupdate (params.Learnables、渐变速度);%显示训练进度。如果情节= =“训练进步”D =持续时间(0,0,toc(开始),“格式”,“hh: mm: ss”);addpoints (lineLossTrain、迭代、双(收集(extractdata(损失))))标题(”时代:“+时代+”,过去:“+ 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“DataFormat”,“CB”);研究生= dlgradient(损失、onnxParams.Learnables);结束
的squeezenetONNX
的ONNX模型squeezenet
网络。
函数squeezenetonnx()excoodonnxnetwork(screezenet,“squeezenet.onnx”);结束
导入ONNX长短期记忆(LSTM)网络作为函数,使用预先训练好的网络对序列数据进行分类。LSTM网络允许您将序列数据输入到网络中,并根据序列数据的单个时间步长进行预测。
这个例子使用了helper函数preparePermutationVector
.要查看此函数的代码,请参见Helper函数.
lstmNet
具有与创建的LSTM网络相似的架构基于深度学习的序列分类.lstmNet
训练,以识别给定的时间序列数据,代表连续两个日本元音。培训数据包含九个扬声器的时间序列数据。每个序列具有12个特征,长度变化。
指定lstmNet
作为模型文件。
modelfile =.“lstmNet.onnx”;
使用。导入预训练的ONNX网络作为函数importONNXFunction
,它返回ONNXParameters
对象参数个数
包含网络参数。该函数还在包含网络架构的当前文件夹中创建了一个新的模型函数。指定模型函数的名称为lstmnetFcn
.
params = importONNXFunction (modelfile,“lstmnetFcn”);
已将包含导入的ONNX网络的函数保存到文件lstmnetFcn.m。要学习如何使用这个函数,输入:help lstmnetFcn。
加载日语元音测试数据。XTest
是一个单元格数组,包含370个长度为12的序列。欧美
为标签“1”,“2”,…“9”,对应9个发言者。
[xtest,ytest] = Japanesevowelstestdata;
lstmNet
使用序列长度相似的小批量进行训练。要以同样的方式组织测试数据,请按序列长度对测试数据进行排序。
numobservationstest = numel(xtest);为i=1:numObservationsTest序列= XTest{i};sequenceLengthsTest (i) =(序列,2)大小;结束[sequenceLengthsTest, idx] = (sequenceLengthsTest)进行排序;XTest = XTest (idx);欧美=欧美(idx);
使用preparePermutationVector
来计算排列向量inputPerm
,将输入序列数据的维度排序置于导入的LSTM网络输入的维度排序。你可以键入帮助lstmnetFcn
查看网络输入的维度顺序sequentInput.
.
inputPerm = preparePermutationVector ([“FeaturesLength”,“SequenceLength”,“BatchSize”],...[“SequenceLength”,“BatchSize”,“FeaturesLength”]);
通过指定要分类的序列数据来计算类的概率XTest
和ONNXParameters
对象参数个数
作为模型函数的输入参数lstmnetFcn
.通过赋值数字向量自定义输入维度顺序inputPerm
到name-value参数“InputDataPermutation”
.返回分数
在维数排序中通过网络输出的分配“没有”
到name-value参数“OutputDataPermutation”
.
为i = 1:length(XTest) scores = lstmnetFcn(XTest{i},params,“InputDataPermutation”inputPerm,“OutputDataPermutation”,“没有”);YPred (i) =找到(分数= = max(分数));结束YPred =分类(YPred ');
计算预测的分类精度。
acc = sum(YPred == YTest)./numel(YTest)
acc = 0.9514
Helper函数
本节提供了辅助功能的代码preparePermutationVector
在这个例子中使用。
的preparePermutationVector
函数返回一个排列向量烫
,它对维度进行排序fromDimOrder
到维度排序toDimOrder
.您可以指定输入参数fromDimOrder
和toDimOrder
例如字符向量、字符串标量、字符串数组、字符向量的单元格数组或数字向量。两个参数必须具有相同的类型和相同的唯一元素。例如,如果fromDimOrder
为字符向量“hwcn”
,toDimOrder
可以是字符向量吗“nchw”
(h
,w
,c
分别对应图像的高度、宽度和通道数量,和n
为观测次数)。
函数perm = preparePermutationVector(fromDimOrder, toDimOrder)%检查fromDimOrder和toDimOrder是否都是向量。如果~isvector(fromDimOrder) || ~isvector(toDimOrder) error(message()“nnet_cnn_onnx: onnx: FPVtypes”));结束%从dimorder和toDimOrder转换为适当的类型。如果isscalar(fromDimOrder) fromDimOrder = char(fromDimOrder);结束如果isstring(toDimOrder) && isscalar(toDimOrder) toDimOrder = char(toDimOrder);结束%检查fromDimOrder和toDimOrder是否有唯一的元素。[fromSorted, ifrom] = unique(fromDimOrder);[toDimOrder, ~, iToInv] =唯一的(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 (fromSorted toSorted)错误消息(“nnet_cnn_onnx: onnx: FPVsame”));结束计算排列向量。ifrom烫= (iToInv);烫=烫发(:)”;结束
modelfile
- - - - - -ONNX模型文件的名称包含网络的ONNX模型文件的名称,指定为字符向量或字符串标量。该文件必须在当前文件夹或MATLAB中的一个文件夹中®路径,否则必须包含文件的完整路径或相对路径。
例子:“shufflenet.onnx”
NetworkFunctionName
- - - - - -模型函数的名称模型函数的名称,指定为字符向量或字符串标量。这个函数NetworkFunctionName
包含导入的ONNX网络的架构。该文件保存在当前文件夹中的m文件中,或者您必须包含该文件的完整路径或相对路径。的NetworkFunctionName
文件是使用网络所必需的。有关更多信息,请参见导入ONNX模型函数.
例子:“shufflenetFcn”
参数个数
——网络参数ONNXParameters
对象网络参数,作为ONNXParameters
对象。参数个数
包含导入的ONNX模型的网络参数。的属性使用点表示法参数个数
.例如,Params.Learnables.
显示网络可学习参数,如卷积层的权重。
importONNXFunction
万博1manbetx支持这些ONNX版本:
ONNX中间表示版本6
ONNX操作符将7设置为13
importONNXFunction
创建一个模型函数,该函数包含导入的ONNX模型的网络架构。指定名称NetworkFunctionName
的输入参数importONNXFunction
.
使用以下语法与导入的ONNX模型函数(NetworkFunctionName
):
[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
不同型号之间可能有差异。有关模型输入和输出参数的更多信息,请参阅帮助
用于导入的模型函数NetworkFunctionName
,或参考ONNX文档[1].
默认情况下,NetworkFunctionName
自动允许输入和输出数据以促进图像分类任务。自动排列可能不适合其他任务,例如对象检测和时间序列分类。
要自动改变输入,NetworkFunctionName
根据导入的ONNX网络指定的输入维度,假设如下。
ONNX模型输入维数 | 输入数据的解释 | ONNX标准尺寸排序 | 深度学习工具箱标准尺寸排序 | 输入的自动排列 |
---|---|---|---|---|
4 | 二维图像 |
|
|
[4 3 1 2] |
如果输入的尺寸不是4,NetworkFunctionName
指定输入参数“InputDataPermutation”
作为“没有”
.
要自动排列输出,NetworkFunctionName
根据导入的ONNX网络指定的输出维度,假设如下。
ONNX模型输出维度的数量 | 输出数据解释 | ONNX标准尺寸排序 | 深度学习工具箱标准尺寸排序 | 自动排列输出 |
---|---|---|---|---|
2 | 二维图像分类评分 |
|
|
[2 1] |
4 | 二维图像像素分类评分 |
|
|
[3 4 2 1] |
如果输出尺寸的大小不是2或4,NetworkFunctionName
指定输入参数“OutputDataPermutation”
作为“没有”
.
importONNXFunction
万博1manbetx支持importONNXFunction
万博1manbetx支持下列ONNX操作符,但有一些限制。将这些操作符与支持的操作符进行比较万博1manbetximportONNXNetwork
和importONNXLayers
用于转换成等效的内置MATLAB层。
ONNX操作符万博1manbetximportONNXFunction |
importONNXNetwork 和importONNXLayers 万博1manbetx |
---|---|
腹肌 |
没有 |
|
是的 |
和 |
没有 |
ArgMax |
没有 |
|
是的 |
|
是的 |
投 |
没有 |
装天花板 |
没有 |
|
是的 |
压缩 |
没有 |
|
是的 |
|
是的 |
ConstantOfShape |
没有 |
|
是的 |
|
是的 |
DepthToSpace |
是的 |
|
是的 |
|
是的 |
平等的 |
没有 |
经验值 |
没有 |
扩大 |
没有 |
|
是的 |
地面 |
没有 |
收集 |
没有 |
|
是的 |
|
是的 |
|
是的 |
Hardmax |
没有 |
|
是的 |
如果 |
没有 |
InstanceNormalization |
是的 |
|
是的 |
少 |
没有 |
LessOrEqual |
没有 |
日志 |
没有 |
循环 |
没有 |
|
是的 |
|
是的 |
|
是的 |
|
是的 |
|
是的 |
负的 |
没有 |
NonMaxSuppression |
没有 |
非零 |
没有 |
不 |
没有 |
OneHot |
没有 |
或 |
没有 |
垫 |
没有 |
战俘 |
没有 |
|
是的 |
RandomUniform |
没有 |
范围 |
没有 |
互惠 |
没有 |
ReduceMax |
没有 |
ReduceMean |
没有 |
ReduceMin |
没有 |
ReduceProd |
没有 |
ReduceSum |
没有 |
|
是的 |
|
是的 |
调整 |
是的 |
RoiAlign |
没有 |
轮 |
没有 |
扫描 |
没有 |
分散 |
没有 |
ScatterElements |
没有 |
SequenceAt |
没有 |
形状 |
没有 |
|
是的 |
片 |
没有 |
|
是的 |
SpaceToDepth |
是的 |
分裂 |
没有 |
SplitToSequence |
没有 |
√6 |
没有 |
挤压 |
没有 |
|
是的 |
|
是的 |
|
是的 |
瓷砖 |
没有 |
TopK |
没有 |
转置 |
没有 |
Unsqueeze |
没有 |
Upsample |
没有 |
在哪里 |
没有 |
importONNXFunction
当您无法使用预先导入预折叠的ONNX网络时很有用importONNXNetwork
.如果您想为预先训练的网络生成代码,请使用importONNXLayers
.使用。查找并替换生成的占位符层findPlaceholderLayers
和replaceLayer
,分别。然后,用汇编
返回一个DAGNetwork
对象。你可以为训练有素的人生成代码DAGNetwork
.有关最适合不同场景的导入函数的更多信息,请参见选择“功能导入ONNX预训练网络”.
你点击一个链接对应于这个MATLAB命令:
通过在MATLAB命令窗口中输入命令来运行命令。Web浏览器不支持MATLAB命令。万博1manbetx
你也可以从以下列表中选择一个网站:
选择中国网站(中文或英文)以获得最佳网站性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。