主要内容

使用模型函数进行预测

此示例演示如何通过将数据拆分为小批量,使用模型函数进行预测。

对于大型数据集,或在内存有限的硬件上进行预测时,通过将数据拆分为小批量来进行预测系列网络达格网络对象时,预测函数自动将输入数据拆分为小批量。对于模型函数,必须手动将数据拆分为小批量。

创建模型函数和加载参数

从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(海底,重量、偏见);终止

Mini-Batch预处理功能

这个预处理小批量函数使用以下步骤对数据进行预处理:

  1. 从传入的单元格数组中提取数据并连接到数字数组中。在第四维上连接会为每个图像添加第三维,用作单通道维度。

  2. 标准化之间的像素值01.

函数X = preprocessMiniBatch(数据)%从单元格提取图像数据并连接X=cat(4,数据{:});将图像归一化。X = X / 255;终止

另见

||||||||||

相关的话题