此示例演示如何通过将数据拆分为小批量,使用模型函数进行预测。
对于大型数据集,或在内存有限的硬件上进行预测时,通过将数据拆分为小批量来进行预测系列网络
或达格网络
对象时,预测
函数自动将输入数据拆分为小批量。对于模型函数,必须手动将数据拆分为小批量。
从MAT文件加载模型参数digitsMIMO.mat
.MAT文件在一个名为参数
,名为的结构中的模型状态状态
,和类名一会
.
s =负载(“digitsMIMO.mat”); 参数=s参数;state=s.state;classNames=s.classNames;
模型函数模型
,定义给定模型参数和状态的模型。
加载用于预测的数字数据。
digitDatasetPath=fullfile(matlabroot,“工具箱”,“nnet”,“nndemos”,...“nndatasets”,“DigitDataset”);imd = imageDatastore (digitDatasetPath,...“IncludeSubfolders”符合事实的...“LabelSource”,“foldernames”);numObservations=numel(imds.Files);
循环测试数据的小批量,并使用自定义预测循环进行预测。
使用minibatchqueue
处理和管理小批量图像。指定一个迷你批处理大小为128。设置镜像数据存储的读大小属性为mini-batch大小。
对于每个小批量:
使用自定义小批量预处理功能预处理小批量
(在本例末尾定义)将数据连接到一个批中并对图像进行规范化。
使用尺寸设置图像格式“SSCB”
(空间、空间、通道、批次)。默认情况下minibatchqueue
对象将数据转换为dlarray
具有底层类型的对象仅有一个的
.
在GPU可用的情况下进行预测。默认情况下,minibatchqueue
对象将输出转换为gpuArray
如果有可用的GPU。使用GPU需要并行计算工具箱™和支持的GPU设备。万博1manbetx有关支持的设备的信息,请参见万博1manbetxGPU支万博1manbetx持情况(并行计算工具箱).
miniBatchSize=128;imds.ReadSize=miniBatchSize;mbq=minibatchqueue(imds,...“MiniBatchSize”miniBatchSize,...“MiniBatchFcn”,@minibatch,...“MiniBatchFormat”,“SSCB”);
循环处理小批量数据,并使用预测
函数。使用onehotdecode
函数确定类标签。存储预测的类标签。
doTraining=false;Y1预测=[];Y2预测=[];%循环小批。而hasdata(mbq)%读取小批量数据。dlX=下一个(mbq);%使用predict函数进行预测。[dlY1Pred, dlY2Pred] =模型(参数、dlX doTraining、状态);%确定相应的类别。Y1PredBatch = onehotdecode (dlY1Pred一会1);Y1Predictions = [Y1Predictions Y1PredBatch];Y2PredBatch = extractdata (dlY2Pred);Y2Predictions = [Y2Predictions Y2PredBatch];终止
看看一些图片和他们的预测。
idx = randperm (numObservations 9);数字对于i = 1:9 subplot(3,3,i) i = imread(imds.Files{idx(i)});imshow (I)在深圳=大小(我,1);抵消= sz / 2;thetaPred = Y2Predictions (idx (i));情节(抵消* [1-tand (thetaPred) 1 +罐内(thetaPred)], [sz 0],“r——”)举行从标签=字符串(Y1Predictions (idx (i)));标题(“标签:”+标签)终止
这个函数模型
获取模型参数参数
,输入数据dlX
,国旗溺爱
它指定建模是否应返回用于训练或预测的输出,以及网络状态状态
。网络输出标签预测、角度预测和更新的网络状态。
函数[dlY1、dlY2] =模型(参数、dlX doTraining,状态)%卷积权重=parameters.conv1.weights;bias=parameters.conv1.bias;dlY=dlconv(dlX,权重,bias,“填充”,“相同”);%批处理规范化,ReLU偏移量=parameters.batchnorm1.offset;scale=parameters.batchnorm1.scale;trainedMean=state.batchnorm1.trainedMean;trainedVariance=state.batchnorm1.trainedVariance;如果doTraining[Dy,trainedMean,trainedVariance]=批次标准(Dy,偏移量,比例,trainedMean,trainedVariance);%更新状态state.batchnorm1。TrainedMean = TrainedMean;state.batchnorm1。TrainedVariance = TrainedVariance;其他的Dy=批次标准(Dy、偏移、比例、训练平均值、训练方差);终止dlY=relu(dlY);%卷积,批处理归一化(跳过连接)权重=parameters.convSkip.weights;bias=parameters.convSkip.bias;dlYSkip=dlconv(dlY,权重,bias,“大步走”2);抵消= parameters.batchnormSkip.Offset;规模= parameters.batchnormSkip.Scale;trainedMean = state.batchnormSkip.TrainedMean;trainedVariance = state.batchnormSkip.TrainedVariance;如果doTraining [dlskip,trainedMean,trainedVariance] = batchnorm(dlskip,offset,scale,trainedMean,trainedVariance);%更新状态state.BatchNormalSkip.TrainedMean=TrainedMean;state.BatchNormalSkip.TrainedVariance=TrainedVariance;其他的dlYSkip = batchnorm (dlYSkip、抵消、规模、trainedMean trainedVariance);终止%卷积权重=parameters.conv2.weights;偏差=参数。2。偏差;dlY=dlconv(dlY、重量、偏差、,“填充”,“相同”,“大步走”2);%批处理规范化,ReLU偏移量=parameters.batchnorm2.offset;scale=parameters.batchnorm2.scale;trainedMean=state.batchnorm2.trainedMean;trainedVariance=state.batchnorm2.trainedVariance;如果doTraining[Dy,trainedMean,trainedVariance]=批次标准(Dy,偏移量,比例,trainedMean,trainedVariance);%更新状态state.batchnorm2。TrainedMean = TrainedMean;state.batchnorm2。TrainedVariance = TrainedVariance;其他的Dy=批次标准(Dy、偏移、比例、训练平均值、训练方差);终止dlY=relu(dlY);%卷积重量= parameters.conv3.Weights;偏见= parameters.conv3.Bias;海底= dlconv(海底,重量、偏见,“填充”,“相同”);%批正常化抵消= parameters.batchnorm3.Offset;规模= parameters.batchnorm3.Scale;trainedMean = state.batchnorm3.TrainedMean;trainedVariance = state.batchnorm3.TrainedVariance;如果doTraining[Dy,trainedMean,trainedVariance]=批次标准(Dy,偏移量,比例,trainedMean,trainedVariance);%更新状态state.batchnorm3。TrainedMean = TrainedMean;state.batchnorm3。TrainedVariance = TrainedVariance;其他的Dy=批次标准(Dy、偏移、比例、训练平均值、训练方差);终止%, ReLUly = dlskip + ly;dlY=relu(dlY);%完全连接,softmax(标签)权重=parameters.fc1.weights;bias=parameters.fc1.bias;dlY1=fullyconnect(dlY,权重,bias);dlY1=softmax(dlY1);%完全连接(角度)重量= parameters.fc2.Weights;偏见= parameters.fc2.Bias;dlY2 = fullyconnect(海底,重量、偏见);终止
这个预处理小批量
函数使用以下步骤对数据进行预处理:
从传入的单元格数组中提取数据并连接到数字数组中。在第四维上连接会为每个图像添加第三维,用作单通道维度。
标准化之间的像素值0
和1.
.
函数X = preprocessMiniBatch(数据)%从单元格提取图像数据并连接X=cat(4,数据{:});将图像归一化。X = X / 255;终止
批次标准
|dlarray
|dlconv
|德尔费瓦尔
|dlgradient
|完全连接
|minibatchqueue
|onehotdecode
|雷卢
|sgdmupdate
|softmax