这个例子展示了如何通过将数据分解成小批来使用模型函数进行预测。
对于大型数据集,或者在内存有限的硬件上进行预测时,可以将数据分成小批进行预测。做预测的时候SeriesNetwork
或DAGNetwork
对象时,预测
函数自动将输入数据分割成小批。对于模型函数,必须手动将数据分割成小批。
从MAT文件加载模型参数digitsMIMO.mat
.MAT文件包含一个名为参数
,模型状态在名为状态
中的类名一会
.
s =负载(“digitsMIMO.mat”);参数= s.parameters;状态= s.state;一会= s.classNames;
该模型函数模型
,给出模型参数和状态定义模型。
加载数字数据以进行预测。
digitDatasetPath = fullfile (matlabroot,“工具箱”,“nnet”,“nndemos”,...“nndatasets”,“DigitDataset”);imd = imageDatastore (digitDatasetPath,...“IncludeSubfolders”,真的,...“LabelSource”,“foldernames”);numObservations =元素个数(imds.Files);
循环测试数据的小批,并使用自定义的预测循环进行预测。
使用minibatchqueue
处理和管理小批映像。指定小批处理大小为128。将镜像数据存储的read size属性设置为mini-batch大小。
为每个mini-batch:
使用自定义小批量预处理功能preprocessMiniBatch
(在本例末尾定义)将数据连接到批处理中,并对图像进行规范化。
用尺寸格式化图像“SSCB”
(空间、空间、通道、批处理)。默认情况下,minibatchqueue
对象将数据转换为dlarray
具有基础类型的对象单
.
如果GPU可用,可以对其进行预测。默认情况下,minibatchqueue
对象将输出转换为gpuArray
图形处理器是否可用。使用GPU需要并行计算工具箱™和支持的GPU设备。金宝app有关支持的设备的信息,请参见金宝appGPU支金宝app持版本(并行计算工具箱).
miniBatchSize = 128;洛桑国际管理发展学院。ReadSize = miniBatchSize;兆贝可= minibatchqueue (imd,...“MiniBatchSize”miniBatchSize,...“MiniBatchFcn”@preprocessMiniBatch,...“MiniBatchFormat”,“SSCB”);
对小批数据进行循环,并使用预测
函数。使用onehotdecode
函数来确定类标签。存储预测的类标签。
doTraining = false;Y1Predictions = [];Y2Predictions = [];%循环小批处理。而hasdata(兆贝可)%读取小批数据。dlX =下一个(兆贝可);%使用预测函数进行预测。[dlY1Pred, dlY2Pred] =模型(参数、dlX doTraining、状态);%确定相应的类。Y1PredBatch = onehotdecode (dlY1Pred一会1);Y1Predictions = [Y1Predictions Y1PredBatch];Y2PredBatch = extractdata (dlY2Pred);Y2Predictions = [Y2Predictions Y2PredBatch];结束
看一些图片和他们的预测。
idx = randperm (numObservations 9);数字为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
的国旗doTraining
哪一个指定是否建模应该返回训练或预测的输出,以及网络状态状态
.网络输出标签的预测、角度的预测和更新后的网络状态。
函数[dlY1、dlY2] =模型(参数、dlX doTraining,状态)%卷积重量= parameters.conv1.Weights;偏见= parameters.conv1.Bias;海底= dlconv (dlX、权重、偏见,“填充”,“相同”);%批标准化,ReLU抵消= parameters.batchnorm1.Offset;规模= parameters.batchnorm1.Scale;trainedMean = state.batchnorm1.TrainedMean;trainedVariance = state.batchnorm1.TrainedVariance;如果doTraining [dlY,trainedMean,trainedVariance] = batchnorm(dlY,offset,scale,trainedMean,trainedVariance);%更新状态state.batchnorm1。TrainedMean = TrainedMean;state.batchnorm1。TrainedVariance = TrainedVariance;其他的海底= batchnorm(海底、抵消、规模、trainedMean trainedVariance);结束海底= relu(海底);%卷积,批处理归一化(跳过连接)重量= parameters.convSkip.Weights;偏见= parameters.convSkip.Bias;dlYSkip = dlconv(海底,重量、偏见,“步”2);抵消= parameters.batchnormSkip.Offset;规模= parameters.batchnormSkip.Scale;trainedMean = state.batchnormSkip.TrainedMean;trainedVariance = state.batchnormSkip.TrainedVariance;如果doTraining [dlYSkip,trainedMean,trainedVariance] = batchnorm(dlYSkip,offset,scale,trainedMean,trainedVariance);%更新状态state.batchnormSkip.TrainedMean = trainedMean;state.batchnormSkip.TrainedVariance = trainedVariance;其他的dlYSkip = batchnorm (dlYSkip、抵消、规模、trainedMean trainedVariance);结束%卷积重量= parameters.conv2.Weights;偏见= parameters.conv2.Bias;海底= dlconv(海底,重量、偏见,“填充”,“相同”,“步”2);%批标准化,ReLU抵消= parameters.batchnorm2.Offset;规模= parameters.batchnorm2.Scale;trainedMean = state.batchnorm2.TrainedMean;trainedVariance = state.batchnorm2.TrainedVariance;如果doTraining [dlY,trainedMean,trainedVariance] = batchnorm(dlY,offset,scale,trainedMean,trainedVariance);%更新状态state.batchnorm2。TrainedMean = TrainedMean;state.batchnorm2。TrainedVariance = TrainedVariance;其他的海底= batchnorm(海底、抵消、规模、trainedMean trainedVariance);结束海底= relu(海底);%卷积重量= parameters.conv3.Weights;偏见= parameters.conv3.Bias;海底= dlconv(海底,重量、偏见,“填充”,“相同”);%批正常化抵消= parameters.batchnorm3.Offset;规模= parameters.batchnorm3.Scale;trainedMean = state.batchnorm3.TrainedMean;trainedVariance = state.batchnorm3.TrainedVariance;如果doTraining [dlY,trainedMean,trainedVariance] = batchnorm(dlY,offset,scale,trainedMean,trainedVariance);%更新状态state.batchnorm3。TrainedMean = TrainedMean;state.batchnorm3。TrainedVariance = TrainedVariance;其他的海底= batchnorm(海底、抵消、规模、trainedMean trainedVariance);结束%, ReLUdlY = dlYSkip + dlY;海底= relu(海底);%完全连接,softmax(标签)重量= parameters.fc1.Weights;偏见= parameters.fc1.Bias;dlY1 = fullyconnect(海底,重量、偏见);dlY1 = softmax (dlY1);完全连接(角度)重量= parameters.fc2.Weights;偏见= parameters.fc2.Bias;dlY2 = fullyconnect(海底,重量、偏见);结束
的preprocessMiniBatch
函数使用以下步骤对数据进行预处理:
从传入单元格数组中提取数据并连接到数字数组中。连接第四个维度为每个图像添加了第三个维度,作为单例通道维度使用。
归一化之间的像素值0
和1
.
函数X = preprocessMiniBatch(数据)%从单元格中提取图像数据并连接X =猫(4、数据{:});%标准化图像。X = X / 255;结束
batchnorm
|dlarray
|dlconv
|dlfeval
|dlgradient
|fullyconnect
|minibatchqueue
|onehotdecode
|线性整流函数(Rectified Linear Unit)
|sgdmupdate
|softmax