unfreezeParameters
描述
params = unfreezeParameters(
参数指定的网络参数解冻参数个数
,的名字
)的名字
在ONNXParameters
对象参数个数
。函数将指定的参数从参数个数。Nonlearnables
在输入参数中参数个数
来参数个数。可学的
在输出参数中参数个数
。
例子
使用自定义训练循环训练导入ONNX函数
导入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_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”);
网络已准备好进行训练。指定培训选项。
速度= [];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
对象
的网络参数ONNXParameters
对象。参数个数
包含导入的ONNX™模型的网络参数。
的名字
- - - - - -要解冻的参数名称
“所有”
|字符串数组
要解冻的参数名称,指定为“所有”
或者一个字符串数组。通过设置解冻所有不可学习参数的名字
来“所有”
。解冻k
通过在1 × -中定义参数名来获取不可学习参数k
字符串数组的名字
。
例子:[" gpu_0_sl_pred_b_0”、“gpu_0_sl_pred_w_0”)
数据类型:字符
|字符串
输出参数
参数个数
—网络参数
ONNXParameters
对象
网络参数,返回为ONNXParameters
对象。参数个数
包含更新的网络参数unfreezeParameters
。
版本历史
R2020b中介绍
Abrir比如
Tiene una versión modificada de este ejemplo。¿Desea abrir este ejemplo con sus modificaciones?
MATLAB突击队
Ha hecho clic en unenlace que对应一个este commando de MATLAB:
弹射突击队introduciéndolo en la ventana de commandos de MATLAB。Los navegadores web no permission comandos de MATLAB。
您也可以从以下列表中选择一个网站:
如何获得最佳的网站性能
选择中国站点(中文或英文)以获得最佳站点性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。