主要内容

freezeParameters

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

自从R2020b

    描述

    例子

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

    例子

    全部折叠

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

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

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

    解压缩(“MerchData.zip”);miniBatchSize = 8;imds = imageDatastore(“MerchData”IncludeSubfolders = true,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);流(“%。2f迁移学习前的准确率\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”);

    网络已准备好进行训练。指定培训选项。

    速度= [];nummepochs = 5;miniBatchSize = 16;initialLearnRate = 0.01;动量= 0.9;衰减= 0.01;

    计算训练进度监视器的迭代总数。

    nummobservations = size(YTrain,2);numIterationsPerEpoch = floor(nummobobservations ./miniBatchSize);numIterations = nummepochs *numIterationsPerEpoch;

    初始化TrainingProgressMonitor对象。因为计时器在创建监视器对象时开始,所以请确保在训练循环之后立即创建对象。

    monitor = trainingProgressMonitor(Metrics= .“损失”信息=“时代”包含=“迭代”);

    训练网络。

    Epoch = 0;迭代= 0;executionEnvironment =“cpu”%改为“gpu”在gpu上训练。%循环遍历。epoch < nummepochs && ~monitor。停止epoch = epoch + 1;% Shuffle数据。idx = randperm(numobobservations);XTrain = XTrain(:,:,:,idx);YTrain = YTrain(:,idx);%小批量循环。I = 0;i < numIterationsPerEpoch && ~monitor。停止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);参数个数。State = State;%确定基于时间的衰减学习率计划的学习率。learnRate = initialLearnRate/(1 +衰减*迭代);%使用SGDM优化器更新网络参数。(参数。= sgdmupdate(params.Learnables,gradients,velocity);更新培训进度监视器。recordMetrics(监控、迭代损失=损失);updateInfo(监视、时代=时代);班长。Progress = 100 * iteration/numIterations;结束结束

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

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

    辅助函数

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

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

    函数精度= 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 0);accuracy = 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”);结束

    输入参数

    全部折叠

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

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

    例子:“所有”

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

    数据类型:字符|字符串

    输出参数

    全部折叠

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

    版本历史

    在R2020b中引入