在定制培训循环更新批规范化统计
这个例子展示了如何在一个自定义更新网络状态训练循环。
一批标准化层规范化mini-batch每个输入通道。加快培训卷积神经网络,减少网络初始化敏感的缺点,使用批卷积层之间的归一化层和非线性,如ReLU层。
在培训期间,第一批标准化层正常化每个通道的激活减去mini-batch均值和除以mini-batch标准差。然后,层变化的输入可学的抵消β可学的比例因子和尺度γ。
网络训练完成后,将批处理计算均值和方差归一化层对整个训练集和商店中的值TrainedMean
和TrainedVariance
属性。当你使用一个训练有素的网络进行预测的新图像,批处理使用训练有素的均值和方差归一化层而不是mini-batch均值和方差标准化激活。
计算数据集的统计数据,批量标准化层跟踪mini-batch统计数据通过使用一个不断更新的状态。如果你是实现一个自定义训练循环,那么你必须更新mini-batches之间的网络状态。
负荷训练数据
的digitTrain4DArrayData
函数加载手写数字图像和数字标签。创建一个arrayDatastore
对象的图像和角度,然后使用结合
函数来生成一个单一的数据存储,其中包含所有的训练数据。提取类名。
[XTrain, TTrain] = digitTrain4DArrayData;dsXTrain = arrayDatastore (XTrain IterationDimension = 4);dsTTrain = arrayDatastore (TTrain);dsTrain =结合(dsXTrain dsTTrain);一会=类别(TTrain);numClasses =元素个数(类名);
定义网络
定义网络和指定图像的平均使用的意思是
选择在图像输入层。
28层= [imageInputLayer([28 1],意思= (XTrain 4) convolution2dLayer (5、20) batchNormalizationLayer reluLayer convolution2dLayer(3、20、填充= 1)batchNormalizationLayer reluLayer convolution2dLayer(3、20、填充= 1)batchNormalizationLayer reluLayer fullyConnectedLayer (numClasses) softmaxLayer];
创建一个dlnetwork
数组对象的层。
净= dlnetwork(层)
网= dlnetwork属性:层:[12×1 nnet.cnn.layer.Layer]连接:[11×2表]可学的:[14×3表]状态:[6×3表]InputNames: {“imageinput”} OutputNames: {“softmax”}初始化:1观点总结总结。
查看网络状态。每一批有归一化层TrainedMean
参数和TrainedVariance
分别包含数据集参数均值和方差。
net.State
ans =6×3表层参数值_________________ _________________ ___________“batchnorm_1”“TrainedMean”{1×1×20 dlarray}“batchnorm_1”“TrainedVariance”{1×1×20 dlarray}“batchnorm_2”“TrainedMean”{1×1×20 dlarray}“batchnorm_2”“TrainedVariance”{1×1×20 dlarray}“batchnorm_3”“TrainedMean”{1×1×20 dlarray}“batchnorm_3”“TrainedVariance”{1×1×20 dlarray}
定义模型损失函数
创建函数modelLoss
上市的例子,作为输入dlnetwork
对象,mini-batch输入数据与相应的标签,并返回损失,损失的梯度对可学的参数,并更新网络状态。
指定培训选项
火车5时代使用mini-batch大小为128。个优化,指定一个学习速率的0.01和0.9的动力。
numEpochs = 5;miniBatchSize = 128;learnRate = 0.01;动量= 0.9;
火车模型
使用minibatchqueue
处理和管理mini-batches图像。为每个mini-batch:
使用自定义mini-batch预处理功能
preprocessMiniBatch
(在这个例子中定义)一个炎热的编码类标签。格式的图像数据维度标签
“SSCB”
(空间、空间、通道、批)。默认情况下,minibatchqueue
把数据转换为对象dlarray
对象与基本类型单
。不格式添加到类的标签。火车在GPU如果一个是可用的。默认情况下,
minibatchqueue
将每个输出转换为对象gpuArray
如果一个GPU是可用的。使用GPU需要并行计算工具箱™和支持GPU设备。万博1manbetx支持设备的信息,请参阅万博1manbetxGPU计算的需求(并行计算工具箱)。
兆贝可= minibatchqueue (dsTrain,…MiniBatchSize = MiniBatchSize,…MiniBatchFcn = @preprocessMiniBatch,…MiniBatchFormat = [“SSCB””“]);
个解算器初始化速度参数。
速度= [];
更新进度条的培训进度监控,计算训练迭代的总数。
numObservationsTrain =元素个数(TTrain);numIterationsPerEpoch =装天花板(numObservationsTrain / miniBatchSize);numIterations = numIterationsPerEpoch * numEpochs;
初始化TrainingProgressMonitor
对象。
监控= = trainingProgressMonitor(指标“损失”信息=“时代”包含=“迭代”);
火车模型使用自定义训练循环。对于每一个时代,洗牌和遍历mini-batches数据的数据。在每次迭代结束时,显示培训进展。为每个mini-batch:
损失评估模型,使用渐变和状态
dlfeval
和modelLoss
功能和更新网络状态。更新网络参数使用
sgdmupdate
函数。
迭代= 0;时代= 0;%循环时期。而时代< numEpochs & & ~班长。停止时代=时代+ 1;%洗牌数据。洗牌(兆贝可)%在mini-batches循环。而hasdata(兆贝可)& & ~班长。停止迭代=迭代+ 1;%读mini-batch数据和标签转换为假%变量。[X, T] =下一个(兆贝可);%损失评估模型,使用dlfeval和渐变和状态% modelLoss功能和更新网络状态。(损失、渐变、状态)= dlfeval (@modelLoss,净,X, T);net.State= state;%更新使用个优化网络参数。(净、速度)= sgdmupdate(净、渐变速度,learnRate动量);%更新培训进度监控。recordMetrics(监控、迭代损失=损失);updateInfo(监视、时代=(时代+“的”+ numEpochs));班长。进步= 100 *(迭代/ numIterations);结束结束
测试模型
测试模型的分类精度通过比较测试集上的预测与真正的标签。测试模型的分类精度通过比较测试集上的预测与真正的标签和角度。
负载测试数据和创建一个包含图片和数据存储功能相结合。
(XTest, tt) = digitTest4DArrayData;dst = arrayDatastore (XTest IterationDimension = 4);
创建一个minibatchqueue
对象流程和管理mini-batches在测试期间的图片。为每个mini-batch:
使用自定义mini-batch预处理功能
preprocessMiniBatchPredictors
定义在这个例子。默认情况下,
minibatchqueue
把数据转换为对象dlarray
对象与基本类型单
。格式的图像尺寸标签“SSCB”
(空间、空间、通道、批)。
mbqTest = minibatchqueue (dst,…MiniBatchSize = MiniBatchSize,…MiniBatchFcn = @preprocessMiniBatchPredictors,…MiniBatchFormat =“SSCB”);
使用的图像进行分类modelPredictions
函数,列出的例子。
预测= modelPredictions(净、mbqTest类名);
评估分类精度。
精度=意味着(预测= = tt)
精度= 0.9958
损失函数模型
的modelLoss
函数作为输入dlnetwork
对象净
和mini-batch输入数据X
与相应的标签T
,并返回损失,损失的梯度对可学的参数净
,和网络状态。自动计算梯度,使用dlgradient
函数。
函数(损失、渐变、状态)= modelLoss(净,X, T) [Y,状态]=前进(净,X);损失= crossentropy (Y, T);梯度= dlgradient(损失、net.Learnables);结束
模型的预测函数
的modelPredictions
函数作为输入dlnetwork
对象净
,一个minibatchqueue
的输入数据兆贝可
,并通过迭代计算模型预测所有数据minibatchqueue
。这个函数使用onehotdecode
函数找到预测类最高的分数。
函数预测= modelPredictions(净、兆贝可类)预测= [];而hasdata(兆贝可)X =(兆贝可);%使用模型函数进行预测。Y =预测(净,X);%确定预测类。YPredBatch = onehotdecode (Y类1);预测=[预测;YPredBatch ');结束结束
小批预处理功能
的preprocessMiniBatch
使用以下步骤:预处理数据函数
预处理的图片和功能使用
preprocessMiniBatchPredictors
函数。从传入单元阵列提取标签数据和连接第二个维度。
一个炎热的分类标签编码成数字数组。编码的第一个维度产生一个相匹配的形状编码阵列网络输出。
函数[X, T] = preprocessMiniBatch (dataX dataY)%从细胞中提取图像数据和连接猫(X = 4, dataX {:});%从细胞中提取标签数据和连接猫(T = 2, dataY {:});%一个炎热的编码标签T = onehotencode (T, 1);结束
Mini-Batch预测预处理功能
的preprocessMiniBatchPredictors
函数进行预处理提取图像数据从传入的预测单元阵列和连接到一个数字数组。连接图像数据在四维空间增加了一个三维图像,作为单通道尺寸。
函数X = preprocessMiniBatchPredictors (dataX)%从细胞中提取图像数据和连接猫(X = 4, dataX {:});结束
另请参阅
dlarray
|dlgradient
|dlfeval
|dlnetwork
|向前
|adamupdate
|预测
|minibatchqueue
|onehotencode
|onehotdecode