主要内容

unfreezeParameters

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

自从R2020b

    描述

    例子

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

    例子

    全部折叠

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

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

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

    解压缩(“MerchData.zip”);miniBatchSize = 8;imds = imageDatastore(“MerchData”IncludeSubfolders = true,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”);

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

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

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

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

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

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

    培训网络。

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

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

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

    辅助函数

    本节提供本例中使用的helper函数的代码。

    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);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”);结束

    输入参数

    全部折叠

    的网络参数ONNXParameters对象。参数个数包含导入的ONNX™模型的网络参数。

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

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

    数据类型:字符|字符串

    输出参数

    全部折叠

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

    版本历史

    R2020b中介绍