主要内容

onnx参数

输入参数ONNX深度学习网络

    描述

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

    创造

    创建一个onnx参数通过使用importONNXFunction

    性质

    全部展开

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

    将新参数添加到参数个数。可学通过使用addParameter.从中删除参数参数个数。可学通过使用移除参数

    访问结构的字段可学通过使用点符号。例如,params.Learnables.conv1_W可以显示第一个卷积层的权重。通过输入params.Learnables.conv1_W=rand([10004096]).有关分配新值和参数命名的详细信息,请参见提示

    网络训练时不变的参数,指定为一个结构。例如,填充和步幅是训练过程中保持不变的参数。

    将新参数添加到参数个数。Nonlearnables通过使用addParameter.从中删除参数参数个数。Nonlearnables通过使用移除参数

    访问结构的字段Nonlearnables通过使用点符号。例如,params.Nonlearnables.conv1_填充无法显示第一个卷积层的填充。有关参数命名的详细信息,请参阅提示

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

    将新参数添加到参数状态通过使用addParameter.从中删除参数参数状态通过使用移除参数

    访问结构的字段状态通过使用点符号。例如,参数State.bn1_var无法显示第一批标准化层的差异。有关参数命名的详细信息,请参阅提示

    此属性是只读的。

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

    访问结构的字段NumDimensions通过使用点符号。例如,params.NumDimensions.conv1\u W可显示第一卷积层权值参数的维数。

    此属性是只读的。

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

    例子:“shufflenetFcn”

    对象的功能

    addParameter 将参数添加到onnx参数对象
    冻结参数 在中转换可学习的网络参数onnx参数无法学习
    移除参数 将参数从onnx参数对象
    unfreezeParameters 在中转换不可学习的网络参数onnx参数可学

    例子

    全部折叠

    导入挤压网将卷积神经网络作为函数,用迁移学习对预先训练好的网络进行微调,对新的图像集合进行分类。

    这个例子使用了几个辅助函数。要查看这些函数的代码,请参见辅助函数

    将新图像解压缩并加载为图像数据存储。图像数据存储自动标签的图像基于文件夹名称和存储数据作为ImageDatastore对象。图像数据存储使您能够存储大型图像数据,包括内存中不适合的数据,并在卷积神经网络训练期间高效地读取图像批。指定最小批大小。

    解压(“MerchData.zip”); miniBatchSize=8;imds=图像数据存储(“MerchData”...“包含子文件夹”符合事实的...“标签源”“foldernames”...“ReadSize”, miniBatchSize);

    该数据集很小,包含75个训练图像。显示一些示例图像。

    numImages=numel(imds.Labels);idx=randperm(numImages,16);图i=1:16子批次(4,4,i)i=readimage(imds,idx(i));imshow(I)结束

    提取训练集并对分类标签进行热编码。

    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'

    参数个数是一个onnx参数对象,该对象包含网络参数。挤压是包含网络体系结构的模型函数。importONNXFunction节省了挤压在当前文件夹中。

    计算新训练集上预训练网络的分类精度。

    AccuracyBeforTraining=GetNetworkAccurance(XTrain、YTrain、params);fprintf(“%.2f迁移学习前的准确度\n”,准确度(再培训前);
    迁移学习前的准确度为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,1512,5);params.Learnables.conv10_B=rand(5,1);

    冻结网络的所有参数以将其转换为不可学习的参数。由于不需要计算冻结层的梯度,因此冻结许多初始层的权重可以显著加快网络训练。

    参数=冻结参数(参数,“所有”);

    解冻网络的最后两个参数,将其转换为可学习的参数。

    参数=解冻参数(参数,“conv10_W”); 参数=解冻参数(参数,“conv10_B”);

    现在网络已经为培训做好了准备。初始化培训进度图。

    情节=“培训进度”如果阴谋==“培训进度”figure lineLossTrain=animatedline;xlabel(“迭代”)伊拉贝尔(“损失”结束

    指定培训选项。

    速度=[];numEpochs=5;miniBatchSize=16;numObservations=大小(YTrain,2);numIterationsPerEpoch=楼层(numObservations./miniBatchSize);initialLearnRate=0.01;动量=0.9;衰减=0.01;

    培训网络。

    迭代=0;开始=tic;executionEnvironment=“cpu”%将“gpu”改为在gpu上训练。%环游各个时代。历元=1:numEpochs%洗牌数据。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。如果(b)执行环境==“自动”&& canUseGPU) || executionEnvironment ==“gpu”X = gpuArray (X);结束%使用dlfeval和%模型梯度函数。[gradients,loss,state]=dlfeval(@modelGradients,X,Y,params);params.state=state;%确定基于时间的衰减学习速率计划的学习速率。learnRate=初始learnRate/(1+衰减*迭代);%使用SGDM优化器更新网络参数。[params.Learnables,velocity]=sgdmupdate(params.Learnables,渐变,velocity);%显示训练进度。如果阴谋==“培训进度”D=持续时间(0,0,toc(开始),“格式”“hh:mm:ss”); 添加点(lineLossTrain、迭代、双(聚集(提取数据(丢失)))标题(“时代:”+时代+”,过去:“+字符串(D)现在开始结束结束结束

    计算微调后网络的分类精度。

    accuracyAfterTraining = getNetworkAccuracy (XTrain、YTrain params);流(' %。2f迁移学习后的准确性\n',准确度(培训后);
    迁移学习后的准确性

    辅助函数

    本节提供本示例中使用的帮助器函数的代码。

    GetNetworkAccurance函数通过计算分类精度来评估网络性能。

    作用= 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;结束

    modelGradients函数计算损失和梯度。

    作用[grad,loss,state]=模型梯度(X,Y,onnxParams)[Y,state]=挤压netfcn(X,onnxParams,“培训”,真正的);损失= crossentropy (y y“数据格式”“CB”); 梯度=dlgradient(损失,onnxParams.Learnables);结束

    挤压函数生成挤压网网络

    作用挤压网络NX()导出网络NX(挤压网络,'squeezenet.onnx');结束

    导入以ONNX格式保存为函数的网络,并使用冻结解冻

    导入预训练的simplenet.onnx网络是一种功能。单纯形是一种基于数字图像数据的简单卷积神经网络。有关如何创建的详细信息,请参见单纯形,请参阅创建简单的图像分类网络

    进口simplenet.onnx使用importONNXFunction,则返回onnx参数对象,该对象包含网络参数。该函数还在包含网络架构的当前文件夹中创建了一个新的模型函数。指定模型函数的名称为单纯形

    params=importonxfunction(“simplenet.onnx”“simplenetFcn”);
    已将包含导入的ONNX网络的函数保存到simplenetFcn.m文件中。要学习如何使用这个函数,输入:help simplenetFcn。

    importONNXFunction将导入的网络参数标记为可学(培训期间更新的参数)或Nonlearnables(训练期间保持不变的参数)。标签并不总是准确的。推荐的做法是检查参数是否分配给正确的结构参数个数。可学参数个数。Nonlearnables.显示导入网络的可学习和不可学习参数。

    参数个数。可学
    ans =结构体字段:imageinput_Mean:[1×1 dlarray]conv_W:[5×5×1×20 dlarray]conv_B:[20×1 dlarray]batchnorm_比例:[20×1 dlarray]batchnorm_B:[20×1 dlarray]fc_W:[24×24×20×10 dlarray]fc_B:[10×1 dlarray]
    参数个数。Nonlearnables
    ans =结构体字段:CONVSTRIP1004:[2×1 dlarray]CONVSDILLATION1005:[2×1 dlarray]CONVSPADDING1006:[4×1 dlarray]CONVSTRIP1007:[2×1 dlarray]CONVSDILLATION1008:[2×1 dlarray]CONVSPADDING1009:[4×1 dlarray]

    注意参数个数。可学包含的参数图像输入平均值,在训练期间应保持不变(请参阅意思是的属性图像输入层).皈依图像输入平均值到一个不可学习的参数。的冻结参数函数删除该参数图像输入平均值从…起可学参数并将其添加到参数个数。Nonlearnables按顺序。

    参数=冻结参数(参数,“imageinput_Mean”);

    显示更新的可学习和不可学习参数。

    参数个数。可学
    ans =结构体字段:conv_W:[5×5×1×20 dlarray]conv_B:[20×1 dlarray]batchnorm_比例:[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] ConvStride1007: [2×1 dlarray] convstride1008: [2×1 dlarray] ConvPadding1009: [4×1 dlarray] imageinput_Mean: [1×1 dlarray]

    提示

    • 将新值指定给对象时,以下规则适用参数个数。可学参数:

      • 软件会自动将新值转换为新值dlarray

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

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

    介绍了R2020b