主要内容

ONNXParameters

导入参数ONNX深度学习网络

    描述

    ONNXParameters包含导入的ONNX™(开放神经网络交换)网络的参数(如权重和偏置)。使用ONNXParameters执行迁移学习等任务。

    创建

    创建一个ONNXParameters对象,使用importONNXFunction

    属性

    全部展开

    在网络训练期间更新的参数,指定为结构。例如,卷积和全连接层的权重是网络在训练过程中学习到的参数。为了防止可学的将训练期间更新的参数转换为Nonlearnables通过使用freezeParameters.将冻结参数转换回可学的通过使用unfreezeParameters

    添加一个新参数参数个数。可学的通过使用addParameter.从参数个数。可学的通过使用removeParameter

    访问结构的字段可学的用点表示法。例如,params.Learnables.conv1_W可以显示第一卷积层的权值。通过输入初始化迁移学习的权重params.Learnables.conv1_W= rand([1000,4096]).有关分配新值和参数命名的详细信息,请参见提示

    网络训练时参数不变,指定为结构。例如,填充和步幅是训练期间保持不变的参数。

    添加一个新参数参数个数。Nonlearnables通过使用addParameter.从参数个数。Nonlearnables通过使用removeParameter

    访问结构的字段Nonlearnables用点表示法。例如,params.Nonlearnables.conv1_Padding可以显示第一个卷积层的填充。有关参数命名的详细信息,请参见提示

    网络状态,指定为结构。网络状态包含迭代之间被网络记住的信息,并在多个训练批之间更新。例如LSTM层和批处理归一化层的状态为状态参数。

    添加一个新参数参数个数。状态通过使用addParameter.从参数个数。状态通过使用removeParameter

    访问结构的字段状态用点表示法。例如,params.State.bn1_var可以显示第一批归一化层的方差。有关参数命名的详细信息,请参见提示

    此属性是只读的。

    每个参数的维数,作为结构指定。NumDimensions包括尾随的单例维度。

    访问结构的字段NumDimensions用点表示法。例如,params.NumDimensions.conv1_W可以显示第一卷积层权重参数的维数。

    此属性是只读的。

    模型函数的名称,指定为字符向量或字符串标量。房地产NetworkFunctionName包含函数的名称NetworkFunctionName,您在其中指定importONNXFunction.这个函数NetworkFunctionName包含了导入的ONNX网络的架构。

    例子:“shufflenetFcn”

    对象的功能

    addParameter 添加参数ONNXParameters对象
    freezeParameters 转换可学习的网络参数ONNXParameters对nonlearnable
    removeParameter 删除参数ONNXParameters对象
    unfreezeParameters 转换不可学习的网络参数ONNXParameters对可学的

    例子

    全部折叠

    导入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_Wconv10_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格式保存的网络作为函数导入,使用移动错误标记的参数冻结解冻

    导入预训练的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]

    提示

    • 属性指定新值时,应用以下规则参数个数。可学的参数:

      • 软件自动将新值转换为adlarray

      • 的现有值必须与新值兼容参数个数。NumDimensions

    • importONNXFunction派生结构的字段名可学的Nonlearnables,状态从导入的ONNX模型文件中的名称。导入的网络之间的字段名可能不同。

    R2020b中介绍