freezeParameters
转换可学习的网络参数ONNXParameters
对nonlearnable
描述
params = freezeParameters(
指定的网络参数被冻结参数个数
,的名字
)的名字
在ONNXParameters
对象参数个数
。函数将指定的参数从参数个数。可学的
在输入参数中参数个数
来参数个数。Nonlearnables
在输出参数中参数个数
。
例子
使用自定义训练循环训练导入ONNX函数
导入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_W
和conv10_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
辅助函数
本节提供本示例中使用的辅助函数的代码。
的getNetworkAccuracy
Function通过计算分类准确率来评估网络性能。
函数精度= 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”);结束
输入参数
参数个数
- - - - - -网络参数
ONNXParameters
对象
网络参数,指定为anONNXParameters
对象。参数个数
包含已导入ONNX™模型的网络参数。
的名字
- - - - - -要冻结的参数名称
“所有”
|字符串数组
要冻结的参数名称,指定为“所有”
或者字符串数组。通过设置冻结所有可学习的参数的名字
来“所有”
。冻结k
通过在1-by-中定义参数名来学习参数k
字符串数组的名字
。
例子:“所有”
例子:[" gpu_0_sl_pred_b_0”、“gpu_0_sl_pred_w_0”)
数据类型:字符
|字符串
输出参数
参数个数
—网络参数
ONNXParameters
对象
网络参数,作为参数返回ONNXParameters
对象。参数个数
包含更新的网络参数freezeParameters
。
版本历史
MATLAB命令
您点击了与此MATLAB命令对应的链接:
通过在MATLAB命令窗口中输入命令来运行该命令。Web浏览器不支持MATLAB命令。万博1manbetx
你亦可选择下列网址:
如何获得最佳的网站性能
选择中国网站(中文或英文)以获得最佳网站性能。其他MathWorks国家网站没有针对您所在位置的访问进行优化。