importONNXFunction
导入预训练的ONNX网络作为函数
描述
从文件中导入ONNX™(Open Neural Network Exchange)网络参数个数
= importONNXFunction (modelfile
,NetworkFunctionName
)modelfile
并返回ONNXParameters
对象(参数个数
),其中包含网络参数。函数还创建了一个模型函数,其名称为NetworkFunctionName
其中包含了网络架构。有关网络功能的详细信息,请参见导入ONNX模型函数.
使用ONNXParameters
对象和NetworkFunctionName
模型函数执行常见的深度学习任务,如图像和序列数据分类、迁移学习、目标检测和图像分割。importONNXFunction
方法在无法导入网络时使用importONNXNetwork
函数(例如,importONNXFunction
可以导入YOLOv3)或者如果您想定义自己的自定义训练循环(有关详细信息,请参阅使用自定义训练循环训练网络).
此函数需要ONNX模型格式的深度学习工具箱™转换器金宝app支持包。如果没有安装此支金宝app持包,则该函数将提供下载链接。
例子
导入ONNX Network作为函数
导入ONNX网络作为函数。您可以将导入的模型函数用于深度学习任务,例如预测和迁移学习。
下载并安装ONNX模型格式的深度学习工具箱转换器支持包。金宝app你可以进入importONNXFunction
在命令行检查是否安装了支持包。金宝app如果没有安装,则该函数将在Add-On资源管理器中提供到所需支持包的链接。金宝app要安装支持包,请单击链接,然后金宝app单击安装.
指定要导入的文件shufflenet
使用ONNX模型动物园的操作符集9。shufflenet
是一种卷积神经网络,它是在ImageNet数据库中的图像上训练的。
modelfile =“shufflenet - 9. onnx”;
将网络作为函数导入,以生成可以用于深度学习任务的模型函数。
params = importONNXFunction“shufflenetFcn”)
函数中包含导入的ONNX网络架构,保存到文件shufflenetFcn.m中。要了解如何使用此函数,输入:help shufflenetFcn。
params = ONNXParameters with properties: Learnables: [1x1 struct] Nonlearnables: [1x1 struct] State: [1x1 struct] NumDimensions: [1x1 struct] NetworkFunctionName: 'shufflenetFcn'
importONNXFunction
返回ONNXParameters
对象参数个数
,其中包含网络参数,以及模型函数shufflnetFcn
,其中包含网络架构。importONNXFunction
节省了shufflenetFcn
在当前文件夹中。您可以打开模型功能,使用,查看或编辑网络架构打开shufflenetFcn
.
ONNX模型格式的深度学习工具箱转换器还提供importONNXNetwork
而且importONNXLayers
函数,您可以使用它来导入预训练的ONNX网络。有关导入函数最适合不同场景的信息,请参见选择Function导入ONNX预训练网络.
使用导入的ONNX函数预测
将ONNX网络作为函数导入,使用预训练的网络预测输入图像的类标签。
指定要导入的文件shufflenet
使用ONNX模型动物园的操作符集9。shufflenet
是一个卷积神经网络,它是在ImageNet数据库中的100多万张图像上进行训练的。因此,该网络已经学习了广泛图像的丰富特征表示。该网络可以将图像分为1000个对象类别,例如键盘、鼠标、铅笔和许多动物。
modelfile =“shufflenet - 9. onnx”;
将预先训练好的ONNX网络作为函数导入,使用importONNXFunction
,它返回ONNXParameters
对象参数个数
.包含网络参数。该函数还在包含网络架构的当前文件夹中创建一个新的模型函数。指定模型函数的名称为shufflenetFcn
.
params = importONNXFunction“shufflenetFcn”);
已将导入的ONNX网络函数保存到文件“shufflenetFcn.m”中。要了解如何使用此函数,输入:help shufflenetFcn。
读取要分类的图像并显示图像的大小。图像是792 × 1056像素,有三个颜色通道(RGB)。
I = imread(“peacock.jpg”);大小(我)
ans =1×3792 1056
将图像大小调整为网络的输入大小。显示图像。
I = imresize(I,[224 224]);imshow(我)
的输入shufflenet
需要进一步预处理(有关详细信息,请参见在ONNX模型动物园ShuffleNet).重新缩放图像。通过减去训练图像的均值,再除以训练图像的标准差,对图像进行归一化。
I = rescale(I,0,1);meanIm = [0.485 0.456 0.406];stdIm = [0.229 0.224 0.225];I = (I - remodeling (meanIm,[1 1 3]))。/重塑(stdIm,[1 1 3]);imshow(我)
导入类名squeezenet
,它也是用ImageNet数据库中的图像进行训练的。
网=挤压网;ClassNames = net.Layers(end).ClassNames;
通过指定要分类的图像来计算类概率我
和ONNXParameters
对象参数个数
作为模型函数的输入参数shufflenetFcn
.
scores = shufflenetFcn(I,params);
找出概率最高的类索引。显示输入图像的预测类别和相应的分类分数。
indMax = find(scores==max(scores));类名(indMax)
ans =1×1单元格数组{“孔雀”}
scoreMax = scores(indMax)
scoreMax = 0.7517
使用自定义训练循环训练导入ONNX函数
导入squeezenet
卷积神经网络作为一个函数,并通过迁移学习对预训练的网络进行微调,对新的图像集合进行分类。
这个例子使用了几个helper函数。要查看这些函数的代码,请参见辅助函数.
解压缩并将新映像加载为映像数据存储。imageDatastore
根据文件夹名称自动标记图像,并将数据存储为ImageDatastore
对象。图像数据存储使您能够存储大量图像数据,包括不适合内存的数据,并在卷积神经网络训练期间有效地读取批量图像。指定小批大小。
解压缩(“MerchData.zip”);miniBatchSize = 8;imds = imageDatastore(“MerchData”,...IncludeSubfolders = true,...LabelSource =“foldernames”,...ReadSize = miniBatchSize);
这个数据集很小,包含75张训练图像。显示一些示例图像。
numImages = nummel (imds.Labels);idx = randperm(numImages,16);数字为i = 1:16 subplot(4,4,i) i = readimage(imds,idx(i));imshow(我)结束
提取训练集,对分类标签进行单热编码。
XTrain = readall(imds);XTrain = single(cat(4,XTrain{:}));YTrain_categ = categorical(imds.Labels);YTrain = onehotencode(YTrain_categ,2)';
确定数据中的类数量。
classes = categories(YTrain_categ);numClasses = numel(类)
numClasses = 5
squeezenet
是一个卷积神经网络,它是在ImageNet数据库中的100多万张图像上进行训练的。因此,该网络已经学习了广泛图像的丰富特征表示。该网络可以将图像分为1000个对象类别,例如键盘、鼠标、铅笔和许多动物。
导入预训练的squeezenet
网络是一种功能。
挤压onnx () params = importONNXFunction()“squeezenet.onnx”,“squeezenetFcn”)
包含导入的ONNX网络架构的函数保存到文件squeezenetFcn.m。要了解如何使用此函数,请键入:help squeezenetFcn。
params = ONNXParameters with properties: Learnables: [1×1 struct] 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精度
精度很低。
通过输入显示网络的可学习参数参数个数。可学的
.这些参数,例如权重(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 = freezeParameters(参数,“所有”);
解冻网络的最后两个参数,将它们转换为可学习的参数。
params = unfreezeParameters(“conv10_W”);params = unfreezeParameters(“conv10_B”);
网络已准备好进行训练。指定培训选项。
速度= [];numEpochs = 5;miniBatchSize = 16;initialLearnRate = 0.01;动量= 0.9;衰减= 0.01;
计算训练进度监控器的总迭代次数。
numObservations = size(YTrain,2);numIterationsPerEpoch = floor(numObservations./miniBatchSize);numIterations = nummepochs *numIterationsPerEpoch;
初始化TrainingProgressMonitor
对象。因为计时器在创建监视器对象时开始,所以请确保在训练循环之后立即创建对象。
monitor = trainingProgressMonitor(指标=“损失”信息=“时代”包含=“迭代”);
培训网络。
Epoch = 0;迭代= 0;executionEnvironment =“cpu”;%更改为“gpu”,在gpu上训练。%遍历epoch。而epoch < numEpochs && ~monitor。停止epoch = epoch + 1;% Shuffle数据。idx = randperm(numObservations);XTrain = XTrain(:,:,:,idx);YTrain = YTrain(:,idx);在小批上循环。I = 0;而i < numIterationsPerEpoch && ~monitor。Stop i = i + 1;迭代=迭代+ 1;读取小批数据。idx = (i-1)*miniBatchSize+1:i*miniBatchSize;X = XTrain(:,:,:,idx);Y = YTrain(:,idx);如果在GPU上训练,则将数据转换为gpuArray。如果(executionEnvironment = =“汽车”&& canUseGPU) || executionEnvironment ==“图形”X = gpuArray(X);结束使用dlfeval和% modelGradients函数。[gradients,loss,state] = dlfeval(@modelGradients,X,Y,params);参数个数。状态=状态;确定基于时间的衰减学习率计划的学习率。learnRate = initialLearnRate/(1 +衰减*迭代);使用SGDM优化器更新网络参数。(参数。Learnables,velocity] = sgdmupdate(params.Learnables,gradients,velocity);更新培训进度监视器。recordMetrics(监控、迭代损失=损失);updateInfo(监视、时代=时代);班长。进度= 100 * iteration/numIterations;结束结束
计算网络经过微调后的分类精度。
accuracyAfterTraining = getNetworkAccuracy(XTrain,YTrain,params);流(“%。2f accuracy after transfer learning\n", accuracyAfterTraining);
迁移学习后的准确率为1.00
辅助函数
本节提供本例中使用的helper函数的代码。
的getNetworkAccuracy
函数通过计算分类精度来评估网络性能。
函数(X,Y,onnxParams) N = size(X,4);Ypred = squeezenetFcn(X,onnxParams,Training=false);[~,YIdx] = max(Y,[],1);[~,YpredIdx] = max(Ypred,[],1);numIncorrect = sum(abs(YIdx-YpredIdx) > 0);1 - numIncorrect/N;结束
的modelGradients
函数计算损失和梯度。
函数[grad, loss, state] = modelGradients(X,Y,onnxParams) [Y, state] = squeezenetFcn(X,onnxParams,Training=true);loss = crossentropy(y, y, DataFormat=“CB”);grad = dlgradient(loss,onnxParams.Learnables);结束
的squeezenetONNX
函数的ONNX模型squeezenet
网络。
函数squeezenetONNX () exportONNXNetwork (squeezenet,“squeezenet.onnx”);结束
使用导入的ONNX函数进行序列分类
导入一个ONNX长短期记忆(LSTM)网络作为函数,利用预先训练好的网络对序列数据进行分类。LSTM网络使您能够将序列数据输入到网络中,并基于序列数据的单个时间步长进行预测。
本例使用helper函数preparePermutationVector
.要查看此函数的代码,请参见Helper函数.
lstmNet
有一个类似于LSTM网络的架构使用深度学习的序列分类.lstmNet
被训练来识别说话人,给定时间序列数据,代表连续说出两个日语元音。训练数据包含9位演讲者的时间序列数据。每个序列有12个特征,长度不同。
指定lstmNet
作为模型文件。
modelfile =“lstmNet.onnx”;
将预先训练好的ONNX网络作为函数导入,使用importONNXFunction
,它返回ONNXParameters
对象参数个数
包含网络参数。该函数还在包含网络架构的当前文件夹中创建一个新的模型函数。指定模型函数的名称为lstmnetFcn
.
params = importONNXFunction“lstmnetFcn”);
已将包含导入ONNX网络的函数保存到“lstmnetFcn.m”文件中。输入help lstmnetFcn可以了解如何使用该函数。
加载日语元音测试数据。XTest
是包含370个12维且长度不等的序列的单元格数组。欧美
是标签“1”,“2”,…“9”,对应9个说话者。
[XTest,YTest] =日本evowelstestdata;
lstmNet
使用具有相似长度序列的小批量进行训练。要以同样的方式组织测试数据,请按序列长度对测试数据进行排序。
numObservationsTest = numel(XTest);为i=1:numObservationsTest sequence = XTest{i};sequenceLengthsTest(i) = size(sequence,2);结束[sequenceLengthsTest,idx] = sort(sequenceLengthsTest);XTest = XTest(idx);YTest = YTest(idx);
使用preparePermutationVector
计算排列向量inputPerm
,将输入序列数据的维序排列为导入的LSTM网络输入的维序。你可以打字帮助lstmnetFcn
查看网络输入的维度顺序SEQUENCEINPUT
.
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) = find(scores==max(scores));结束YPred = category (YPred');
计算预测的分类精度。
acc = sum(YPred == YTest)./ nummel (YTest)
Acc = 0.9514
Helper函数
介绍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”));结束%将fromDimOrder和toDimOrder转换为适当的类型。如果isstring(fromDimOrder) && isscalar(fromDimOrder) fromDimOrder = char(fromDimOrder);结束如果isstring(toDimOrder) && isscalar(toDimOrder) toDimOrder = char(toDimOrder);结束检查fromDimOrder和toDimOrder是否有唯一的元素。[fromSorted, ifrom] = unique(fromDimOrder);[toSorted, ~, iToInv] = unique(toDimOrder);如果numel(fromSorted) ~= numel(fromDimOrder) error(message(“nnet_cnn_onnx: onnx: FPVfromunique”));结束如果数字(toDimOrder) ~=数字(toDimOrder)错误(message(“nnet_cnn_onnx: onnx: FPVtounique”));结束检查fromDimOrder和toDimOrder是否有相同数量的元素。如果~isequal(fromSorted, toSorted) error(message(“nnet_cnn_onnx: onnx: FPVsame”));结束计算排列向量。perm = ifrom(iToInv);Perm = Perm (:)';结束
输入参数
modelfile
- - - - - -ONNX模型文件名称
特征向量|字符串标量
包含网络的ONNX模型文件的名称,指定为字符向量或字符串标量。该文件必须在当前文件夹或MATLAB中的文件夹中®路径,或者必须包含文件的完整路径或相对路径。
例子:“shufflenet.onnx”
NetworkFunctionName
- - - - - -模型函数名称
特征向量|字符串标量
模型函数的名称,指定为字符向量或字符串标量。这个函数NetworkFunctionName
包含了导入的ONNX网络的架构。该文件保存在当前文件夹中的m文件中,或者必须包含该文件的完整或相对路径。的NetworkFunctionName
文件是使用网络所必需的。有关更多信息,请参见导入ONNX模型函数.
例子:“shufflenetFcn”
输出参数
参数个数
—网络参数
ONNXParameters
对象
网络参数,返回为ONNXParameters
对象。参数个数
包含导入的ONNX模型的网络参数。的属性使用点表示法参数个数
.例如,参数个数。可学的
显示网络可学习参数,如卷积层的权重。
限制
importONNXFunction
金宝app支持以下ONNX版本:ONNX中间表示版本6
ONNX操作符集7到13
更多关于
进口ONNX模型函数
importONNXFunction
创建一个包含导入ONNX模型的网络架构的模型函数。指定名称NetworkFunctionName
的输入参数importONNXFunction
.
使用以下语法与导入的ONNX模型函数(NetworkFunctionName
):
[Y,state] = NetworkFunctionName(X,
返回输出数据参数个数
)Y
更新后的网络状态
对于输入数据X
.[Y,state] = 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”
作为“没有”
.
ONNX操作符importONNXFunction
金宝app支持
importONNXFunction
金宝app支持以下ONNX操作符,但有一些限制。所支持的操作符与这些操作符进行比较金宝appimportONNXNetwork
而且importONNXLayers
转换为等效的内置MATLAB层。
ONNX操作符金宝appimportONNXFunction |
importONNXNetwork 而且importONNXLayers 金宝app |
---|---|
腹肌 |
没有 |
|
是的 |
和 |
没有 |
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
,分别。然后,用assembleNetwork
返回DAGNetwork
对象。您可以为训练有素的对象生成代码DAGNetwork
.有关最适合不同场景的导入函数的详细信息,请参见选择Function导入ONNX预训练网络.
版本历史
R2020b中介绍
MATLAB命令
你点击了一个对应于这个MATLAB命令的链接:
在MATLAB命令窗口中输入该命令来运行该命令。Web浏览器不支持MATLAB命令。金宝app
您也可以从以下列表中选择一个网站:
如何获得最佳的网站性能
选择中国站点(中文或英文)以获得最佳站点性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。