使用模型函数进行预测
这个例子展示了如何通过将数据分成小批量来使用模型函数进行预测。
对于大型数据集,或者在内存有限的硬件上进行预测时,可以通过将数据分割成小批量进行预测。在做预测的时候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个小批处理大小。将图像数据存储的读取大小属性设置为小批量大小。
为每个mini-batch:
使用自定义的小批量预处理功能
preprocessMiniBatch
(在本例的末尾定义)将数据连接到一个批处理中,并对图像进行标准化。用尺寸格式化图像
“SSCB”
(spatial, spatial, channel, batch)。默认情况下,minibatchqueue
对象将数据转换为dlarray
具有基础类型的对象单
.预测GPU是否可用。默认情况下,
minibatchqueue
对象将输出转换为gpuArray
如果GPU可用。使用GPU需要并行计算工具箱™和支持的GPU设备。金宝app有关支持的设备的信息,请参见金宝app不同版本金宝app的GPU支持(并行计算工具箱).
miniBatchSize = 128;洛桑国际管理发展学院。ReadSize = miniBatchSize;兆贝可= minibatchqueue (imd,...“MiniBatchSize”miniBatchSize,...“MiniBatchFcn”@preprocessMiniBatch,...“MiniBatchFormat”,“SSCB”);
方法对小批量数据进行循环并进行预测预测
函数。使用onehotdecode
函数确定类标签。存储预期的类标签。
doTraining = false;Y1Predictions = [];Y2Predictions = [];%对小批量进行循环。而hasdata(兆贝可)%读取小批量数据。dlX =下一个(兆贝可);使用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
的国旗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 [dlskip,trainedMean,trainedVariance] = batchnorm(dlskip,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);结束%, ReLUd = d跳跃+ d;海底= relu(海底);完全连接,softmax(标签)重量= parameters.fc1.Weights;偏见= parameters.fc1.Bias;dlY1 = fullyconnect(海底,重量、偏见);dlY1 = softmax (dlY1);全连接(角度)重量= parameters.fc2.Weights;偏见= parameters.fc2.Bias;dlY2 = fullyconnect(海底,重量、偏见);结束
Mini-Batch预处理功能
的preprocessMiniBatch
函数使用以下步骤对数据进行预处理:
从输入的单元格数组中提取数据并连接到数字数组中。连接第四个维度为每个图像增加了第三个维度,用作单例通道维度。
之间的像素值归一化
0
和1
.
函数X = preprocessMiniBatch(数据)从单元格中提取图像数据并连接X =猫(4、数据{:});%对图像进行归一化。X = X / 255;结束
另请参阅
dlarray
|dlgradient
|dlfeval
|sgdmupdate
|dlconv
|batchnorm
|线性整流函数(Rectified Linear Unit)
|fullyconnect
|softmax
|minibatchqueue
|onehotdecode