主要内容

freezeParameters

转换可学习的网络参数ONNXParameters对nonlearnable

    描述

    例子

    params = freezeParameters(参数个数的名字指定的网络参数被冻结的名字ONNXParameters对象参数个数。函数将指定的参数从参数个数。可学的在输入参数中参数个数参数个数。Nonlearnables在输出参数中参数个数

    例子

    全部折叠

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

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

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

    解压缩(“MerchData.zip”);miniBatchSize = 8;imds = imageDatastore(“MerchData”“IncludeSubfolders”,真的,“LabelSource”“foldernames”“ReadSize”, miniBatchSize);

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

    numImages = numel(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_category = categorical(imds.Labels);YTrain = onehotencode(ytrain_category,2)';

    确定数据中类的数量。

    class = categories(ytrain_category);numClasses = nummel (classes)
    numClasses = 5

    squeezenet是一个卷积神经网络,经过ImageNet数据库中超过一百万张图像的训练。因此,网络已经学习了大量图像的丰富特征表示。该网络可以将图像分为1000个对象类别,如键盘、鼠标、铅笔和许多动物。

    导入预训练squeezenet网络作为一个功能。

    squeezenetONNX()参数= 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);流(' %。迁移学习前的准确率\n', accuracyBeforeTraining);
    迁移学习前的准确率为0.01

    精度很低。

    通过输入显示网络可学习的参数参数个数。可学的。这些参数,例如权重(W)和偏见(B)的卷积和完全连接层,在训练过程中由网络更新。不可学习参数在训练过程中保持不变。

    预训练网络的最后两个可学习参数配置为1000个类。

    conv10_W: [1×1×512×1000 darray]

    conv10_B: [1000×1 array]

    的参数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 (“损失”结束

    指定培训选项。

    速度= [];nummepochs = 5;miniBatchSize = 16;nummobservations = size(YTrain,2);numIterationsPerEpoch = floor(nummobobservations ./miniBatchSize);initialLearnRate = 0.01;动量= 0.9;衰减= 0.01;

    训练网络。

    迭代= 0;Start = tic;executionEnvironment =“cpu”%改为“gpu”在gpu上训练。%循环遍历。epoch = 1: nummepochs% Shuffle数据。idx = randperm(numobobservations);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 = State;%确定基于时间的衰减学习率计划的学习率。learnRate = initialLearnRate/(1 +衰减*迭代);%使用SGDM优化器更新网络参数。(参数。= sgdmupdate(params.Learnables,gradients,velocity);%显示培训进度。如果情节= =“训练进步”D = duration(0,0,toc(start));“格式”“hh: mm: ss”);addpoints (lineLossTrain、迭代、双(收集(extractdata(损失))))标题(”时代:“+ epoch +“,流逝:”+ string(D)) drawnow结束结束结束

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

    accuracyAfterTraining = getNetworkAccuracy(XTrain,YTrain,params);流(' %。迁移学习后的准确率\n', accuracyAfterTraining);
    迁移学习后的精度为1.00

    辅助函数

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

    getNetworkAccuracyFunction通过计算分类准确率来评估网络性能。

    函数精度= 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 0);accuracy = 1 - numIncorrect/N;结束

    modelGradients函数计算损失和梯度。

    函数[grad, loss, state] = modelGradients(X,Y,onnxParams) [Y, state] = squeezenetFcn(X,onnxParams,“培训”,真正的);loss = crossentropy(y, y,“DataFormat”“CB”);grad = dlgradient(loss,onnxParams.Learnables);结束

    squeezenetONNX的ONNX模型squeezenet网络。

    函数squeezenetONNX () exportONNXNetwork (squeezenet,“squeezenet.onnx”);结束

    输入参数

    全部折叠

    网络参数,指定为anONNXParameters对象。参数个数包含已导入ONNX™模型的网络参数。

    要冻结的参数名称,指定为“所有”或者字符串数组。通过设置冻结所有可学习的参数的名字“所有”。冻结k通过在1-by-中定义参数名来学习参数k字符串数组的名字

    例子:“所有”

    例子:[" gpu_0_sl_pred_b_0”、“gpu_0_sl_pred_w_0”)

    数据类型:字符|字符串

    输出参数

    全部折叠

    网络参数,作为参数返回ONNXParameters对象。参数个数包含更新的网络参数freezeParameters

    版本历史

    在R2020b中引入