主要内容

unfreezeParameters

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

    描述

    例子

    params = unfreezeParameters (参数个数,的名字)解冻指定的网络参数的名字ONNXParameters对象参数个数。移动指定的参数的函数params.Nonlearnables在输入参数参数个数params.Learnables在输出参数参数个数

    例子

    全部折叠

    导入squeezenet卷积神经网络作为和微调pretrained网络传输函数学习新收集的图像进行分类。

    这个示例使用一些辅助函数。要查看这些函数的代码,看看辅助函数

    解压缩和加载新的图像作为图像数据存储。imageDatastore自动标签图像基于文件夹的名字和存储数据作为ImageDatastore对象。图像数据存储可以存储大量图像数据,包括数据,并不适合在内存中,有效地阅读批图像卷积神经网络在训练。指定mini-batch大小。

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

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

    numImages =元素个数(imds.Labels);idx = randperm (numImages 16);图i = 1:16次要情节(4 4 i) i = readimage (imd, idx (i));imshow(我)结束

    提取训练集和一个炎热的编码分类分类标签。

    XTrain = readall (imd);XTrain =单(cat (4, XTrain {:}));YTrain_categ =分类(imds.Labels);YTrain = onehotencode (YTrain_categ, 2) ';

    确定数据的类的数量。

    类=类别(YTrain_categ);numClasses =元素个数(类)
    numClasses = 5

    squeezenet是一个卷积神经网络,训练图像从ImageNet数据库超过一百万。因此,网络学习丰富广泛的图像特征表示。网络可以分类图像到1000年对象类别,如键盘,鼠标,铅笔,和许多动物。

    导入pretrainedsqueezenet网络作为一个函数。

    squeezenetONNX () params = importONNXFunction (“squeezenet.onnx”,“squeezenetFcn”)
    一个函数包含进口squeezenetFcn.m ONNX网络已经保存到文件。学习如何使用这个函数,类型:帮助squeezenetFcn。
    params = ONNXParameters属性:可学的:[1×1 struct] Nonlearnables: [1×1 struct]状态:[1×1 struct] NumDimensions: [1×1 struct] NetworkFunctionName:“squeezenetFcn”

    参数个数是一个ONNXParameters对象包含网络参数。squeezenetFcn是一个函数,它包含网络体系结构模型。importONNXFunction节省了squeezenetFcn在当前文件夹。

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

    accuracyBeforeTraining = getNetworkAccuracy (XTrain、YTrain params);流(' %。2 f精度转移之前学习\ n”,accuracyBeforeTraining);
    0.01精度在转移之前的学习

    精度很低。

    显示可学的网络输入参数params.Learnables。这些参数,如重量(W)和偏见(B更新)的卷积和完全连接层,通过网络在训练。培训期间Nonlearnable参数保持不变。

    最后两个可学的pretrained网络参数配置为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);

    冻结所有网络的参数,将它们转换为nonlearnable参数。因为你不需要计算梯度的冷冻层,冻结许多初始层的权重可以显著加快网络训练。

    params = freezeParameters (params,“所有”);

    解冻的最后两个参数网络将它们转换为可学的参数。

    params = unfreezeParameters (params,“conv10_W”);params = unfreezeParameters (params,“conv10_B”);

    现在的网络是为培训做好准备。初始化培训进展阴谋。

    情节=“训练进步”;如果情节= =“训练进步”图lineLossTrain = animatedline;包含(“迭代”)ylabel (“损失”)结束

    指定培训选项。

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

    培训网络。

    迭代= 0;开始=抽搐;executionEnvironment =“cpu”;变化百分比gpu上“gpu”训练。%循环时期。时代= 1:numEpochs%洗牌数据。idx = randperm (numObservations);XTrain = XTrain (:,:,:, idx);YTrain = YTrain (:, idx);%在mini-batches循环。i = 1: numIterationsPerEpoch迭代=迭代+ 1;% mini-batch读取的数据。idx =(张)* miniBatchSize + 1:我* miniBatchSize;X = XTrain (:,:,:, idx);Y = YTrain (:, idx);%如果训练在GPU,然后将数据转换成gpuArray。如果(executionEnvironment = =“汽车”& & canUseGPU) | | executionEnvironment = =“图形”X = gpuArray (X);结束%计算模型使用dlfeval和梯度和损失% modelGradients函数。(渐变、损失、状态)= dlfeval (@modelGradients, X, Y, params);参数个数。=状态;%确定基于时间的学习速率衰减学习速率的时间表。learnRate = initialLearnRate /(1 +衰变*迭代);%更新使用个优化网络参数。(参数。可学的,速度]= sgdmupdate (params.Learnables、渐变速度);%显示培训进展。如果情节= =“训练进步”D =持续时间(0,0,toc(开始),“格式”,“hh: mm: ss”);addpoints (lineLossTrain、迭代、双(收集(extractdata(损失))))标题(”时代:“+时代+”,过去:“+ drawnow字符串(D))结束结束结束

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

    accuracyAfterTraining = getNetworkAccuracy (XTrain、YTrain params);流(' %。2 f准确性后转移学习\ n”,accuracyAfterTraining);
    1.00精度转移学习

    辅助函数

    本节提供的代码在这个例子中使用的辅助函数。

    getNetworkAccuracy功能评估网络性能通过计算分类精度。

    函数精度= getNetworkAccuracy (X, Y, onnxParams) N =大小(X, 4);onnxParams Ypred = squeezenetFcn (X,“培训”、假);[~,YIdx] = max (Y, [], 1);[~,YpredIdx] = max (Ypred [], 1);numIncorrect =总和(abs (YIdx-YpredIdx) > 0);精度= 1 - numIncorrect / N;结束

    modelGradients函数计算损失和梯度。

    函数(研究生、损失、状态)= modelGradients (X, Y, onnxParams) [Y,状态]= squeezenetFcn (X, onnxParams“培训”,真正的);损失= crossentropy (y y“DataFormat”,“CB”);研究生= dlgradient(损失、onnxParams.Learnables);结束

    squeezenetONNX函数生成一个ONNX模型squeezenet网络。

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

    输入参数

    全部折叠

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

    参数的名称解冻,指定为“所有”或一个字符串数组。解冻所有nonlearnable参数设置的名字“所有”。解冻knonlearnable参数通过定义的参数名称1 -k字符串数组的名字

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

    数据类型:字符|字符串

    输出参数

    全部折叠

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

    版本历史

    介绍了R2020b