ONNXParameters
导入参数ONNX深度学习网络
描述
ONNXParameters
包含导入的ONNX™(开放神经网络交换)网络的参数(如权重和偏置)。使用ONNXParameters
执行迁移学习等任务。
创建
创建一个ONNXParameters
对象,使用importONNXFunction
.
属性
可学的
- - - - - -网络训练时更新的参数
结构
在网络训练期间更新的参数,指定为结构。例如,卷积和全连接层的权重是网络在训练过程中学习到的参数。为了防止可学的
将训练期间更新的参数转换为Nonlearnables
通过使用freezeParameters
.将冻结参数转换回可学的
通过使用unfreezeParameters
.
添加一个新参数参数个数。可学的
通过使用addParameter
.从参数个数。可学的
通过使用removeParameter
.
访问结构的字段可学的
用点表示法。例如,params.Learnables.conv1_W
可以显示第一卷积层的权值。通过输入初始化迁移学习的权重params.Learnables.conv1_W= rand([1000,4096])
.有关分配新值和参数命名的详细信息,请参见提示.
Nonlearnables
- - - - - -网络训练时参数不变
结构
网络训练时参数不变,指定为结构。例如,填充和步幅是训练期间保持不变的参数。
添加一个新参数参数个数。Nonlearnables
通过使用addParameter
.从参数个数。Nonlearnables
通过使用removeParameter
.
访问结构的字段Nonlearnables
用点表示法。例如,params.Nonlearnables.conv1_Padding
可以显示第一个卷积层的填充。有关参数命名的详细信息,请参见提示.
状态
- - - - - -网络状态
结构
网络状态,指定为结构。网络状态
包含迭代之间被网络记住的信息,并在多个训练批之间更新。例如LSTM层和批处理归一化层的状态为状态
参数。
添加一个新参数参数个数。状态
通过使用addParameter
.从参数个数。状态
通过使用removeParameter
.
访问结构的字段状态
用点表示法。例如,params.State.bn1_var
可以显示第一批归一化层的方差。有关参数命名的详细信息,请参见提示.
NumDimensions
- - - - - -每个参数的维数
结构
此属性是只读的。
每个参数的维数,作为结构指定。NumDimensions
包括尾随的单例维度。
访问结构的字段NumDimensions
用点表示法。例如,params.NumDimensions.conv1_W
可以显示第一卷积层权重参数的维数。
NetworkFunctionName
- - - - - -模型函数名称
特征向量|字符串标量
此属性是只读的。
模型函数的名称,指定为字符向量或字符串标量。房地产NetworkFunctionName
包含函数的名称NetworkFunctionName
,您在其中指定importONNXFunction
.这个函数NetworkFunctionName
包含了导入的ONNX网络的架构。
例子:“shufflenetFcn”
对象的功能
addParameter |
添加参数ONNXParameters 对象 |
freezeParameters |
转换可学习的网络参数ONNXParameters 对nonlearnable |
removeParameter |
删除参数ONNXParameters 对象 |
unfreezeParameters |
转换不可学习的网络参数ONNXParameters 对可学的 |
例子
使用自定义训练循环训练导入ONNX函数
导入squeezenet
卷积神经网络作为一个函数,并通过迁移学习对预训练的网络进行微调,对新的图像集合进行分类。
这个例子使用了几个helper函数。要查看这些函数的代码,请参见辅助函数.
解压缩并将新映像加载为映像数据存储。imageDatastore
根据文件夹名称自动标记图像,并将数据存储为ImageDatastore
对象。图像数据存储使您能够存储大量图像数据,包括不适合内存的数据,并在卷积神经网络训练期间有效地读取批量图像。指定小批大小。
解压缩(“MerchData.zip”);miniBatchSize = 8;imds = imageDatastore(“MerchData”,…“IncludeSubfolders”,真的,…“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精度\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”);
现在网络已经准备好进行训练了。初始化培训进度图。
情节=“训练进步”;如果情节= =“训练进步”图lineLossTrain = animatedline;包含(“迭代”) ylabel (“损失”)结束
指定培训选项。
速度= [];numEpochs = 5;miniBatchSize = 16;numObservations = size(YTrain,2);numIterationsPerEpoch = floor(numObservations./miniBatchSize);initialLearnRate = 0.01;动量= 0.9;衰减= 0.01;
培训网络。
迭代= 0;开始= tic;executionEnvironment =“cpu”;%更改为“gpu”,在gpu上训练。%遍历epoch。为epoch = 1:numEpochs% Shuffle数据。idx = randperm(numObservations);XTrain = XTrain(:,:,:,idx);YTrain = YTrain(:,idx);在小批上循环。为i = 1:numIterationsPerEpoch迭代=迭代+ 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);参数个数。状态= state;确定基于时间的衰减学习率计划的学习率。learnRate = initialLearnRate/(1 +衰减*迭代);使用SGDM优化器更新网络参数。(参数。Learnables,velocity] = sgdmupdate(params.Learnables,gradients,velocity);%显示培训进度。如果情节= =“训练进步”D = duration(0,0,toc(start),“格式”,“hh: mm: ss”);addpoints (lineLossTrain、迭代、双(收集(extractdata(损失))))标题(”时代:“+ epoch +,消失:"+字符串(D))现在绘制结束结束结束
计算网络经过微调后的分类精度。
accuracyAfterTraining = getNetworkAccuracy(XTrain,YTrain,params);流(' %。迁移学习后的2f精度\n', accuracyAfterTraining);
迁移学习后的准确率为1.00
辅助函数
本节提供本例中使用的helper函数的代码。
的getNetworkAccuracy
函数通过计算分类精度来评估网络性能。
函数(X,Y,onnxParams) N = size(X,4);Ypred = squeezenetFcn(X,onnxParams,“培训”、假);[~,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,“培训”,真正的);损失=交叉熵(y, y,“DataFormat”,“CB”);grad = dlgradient(loss,onnxParams.Learnables);结束
的squeezenetONNX
函数的ONNX模型squeezenet
网络。
函数squeezenetONNX () exportONNXNetwork (squeezenet,“squeezenet.onnx”);结束
ONNX函数导入器错误标记移动参数
将ONNX格式保存的网络作为函数导入,使用移动错误标记的参数冻结
或解冻
.
导入预训练的simplenet.onnx
网络是一种功能。simplenet
是一个以数字图像数据为训练对象的简单卷积神经网络。有关如何创建的更多信息simplenet
,请参阅创建简单的图像分类网络.
进口simplenet.onnx
使用importONNXFunction
,该函数返回ONNXParameters
对象,该对象包含网络参数。该函数还在包含网络架构的当前文件夹中创建一个新的模型函数。指定模型函数的名称为simplenetFcn
.
参数= importONNXFunction(“simplenet.onnx”,“simplenetFcn”);
已将包含导入ONNX网络的函数保存到“simplenetFcn.m”文件中。要了解如何使用此函数,请键入:help simplenetFcn。
importONNXFunction
将导入的网络参数标记为可学的
(在训练期间更新的参数)或Nonlearnables
(训练期间保持不变的参数)。标签并不总是准确的。建议的做法是检查参数是否分配给正确的结构参数个数。可学的
或参数个数。Nonlearnables
.显示导入网络的可学习参数和不可学习参数。
参数个数。可学的
ans =带字段的结构:imageinput_Mean: [1×1 darray] conv_W: [5×5×1×20 dlarray] conv_B: [20×1 dlarray] batchnorm_scale: [20×1 dlarray] batchnorm_B: [20×1 dlarray] fc_W: [24×24×20×10 dlarray] fc_B: [10×1 dlarray]
参数个数。Nonlearnables
ans =带字段的结构:ConvStride1004: [2×1 darray] ConvDilationFactor1005: [2×1 dlarray] ConvPadding1006: [4×1 dlarray] ConvStride1007: [2×1 dlarray] ConvDilationFactor1008: [2×1 dlarray] ConvPadding1009: [4×1 dlarray]
请注意,参数个数。可学的
包含参数imageinput_Mean
,在训练期间应保持不变(请参阅的意思是
的属性imageInputLayer
).转换imageinput_Mean
到一个不可学习的参数。的freezeParameters
函数删除参数。imageinput_Mean
从参数。可学的
并将其添加到参数个数。Nonlearnables
按顺序。
params = freezeParameters(参数,“imageinput_Mean”);
显示更新后的可学习参数和不可学习参数。
参数个数。可学的
ans =带字段的结构:conv_W: [5×5×1×20 dlarray] conv_B: [20×1 dlarray] batchnorm_scale: [20×1 dlarray] batchnorm_B: [20×1 dlarray] fc_W: [24×24×20×10 dlarray] fc_B: [10×1 dlarray]
参数个数。Nonlearnables
ans =带字段的结构:ConvStride1004: [2×1 dlarray] ConvDilationFactor1005: [2×1 dlarray] ConvPadding1006: [4×1 dlarray] ConvStride1007: [2×1 dlarray] ConvDilationFactor1008: [2×1 dlarray] ConvPadding1009: [4×1 dlarray] imageinput_Mean: [1×1 dlarray]
提示
属性指定新值时,应用以下规则
参数个数。可学的
参数:软件自动将新值转换为a
dlarray
.的现有值必须与新值兼容
参数个数。NumDimensions
.
importONNXFunction
派生结构的字段名可学的
,Nonlearnables
,状态
从导入的ONNX模型文件中的名称。导入的网络之间的字段名可能不同。
MATLAB命令
你点击了一个对应于这个MATLAB命令的链接:
在MATLAB命令窗口中输入该命令来运行该命令。Web浏览器不支持MATLAB命令。万博1manbetx
您也可以从以下列表中选择一个网站:
如何获得最佳的网站性能
选择中国站点(中文或英文)以获得最佳站点性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。