检测在深层神经网络训练问题
这个例子展示了如何自动检测问题,训练神经网络。
为深度学习培训网络时,它通常是有用的监测培训进展。在这个例子中,使用一个trainingProgressMonitor
对象来检查你的网络是否过度拟合训练中。
加载和数据预处理
数字数据加载图像数据存储使用imageDatastore
功能和指定包含图像数据的文件夹。
dataFolder = fullfile (toolboxdir (“nnet”),“nndemos”,“nndatasets”,“DigitDataset”);imd = imageDatastore (dataFolder,…IncludeSubfolders = true,…。LabelSource =“foldernames”);
选择70%的数据训练和验证为30%。为了演示过度拟合,这个例子不随机数据分割。
trainingProportion = 0.7;[imdsTrain, imdsValidation] = splitEachLabel (imd, trainingProportion);
在这个例子中使用的网络28-by-28-by-1需要输入图像的大小。自动调整训练和验证图像,使用一个增强图像数据存储。
inputSize = [28 28 1];augimdsTrain = augmentedImageDatastore (inputSize (1:2), imdsTrain);augimdsValidation = augmentedImageDatastore (inputSize (1:2), imdsValidation);
确定训练数据的类的数量。
类=类别(imdsTrain.Labels);numClasses =元素个数(类);
定义网络
定义网络图像分类。
图像输入,指定一个图像输入层与输入训练数据匹配的大小。
不正常的图像输入,设置
归一化
选择输入层“没有”
。指定三个convolution-batchnorm-ReLU块。
垫卷积的输入层,通过设置的输出具有相同的大小
填充
选项“相同”
。第一卷积层指定20过滤器的大小5。对于剩下的卷积层,指定20过滤器的大小3。
对于分类,指定一个完全连接层与大小匹配的类的数量
输出映射到概率,包括softmax层。
当培训网络使用自定义循环,不包括一个输出层。
层= [imageInputLayer (inputSize正常化=“没有”)convolution2dLayer(5、20、填充=“相同”)batchNormalizationLayer reluLayer convolution2dLayer(3、20、填充=“相同”)batchNormalizationLayer reluLayer convolution2dLayer(3、20、填充=“相同”)batchNormalizationLayer reluLayer fullyConnectedLayer (numClasses) softmaxLayer];
创建一个dlnetwork
数组对象的层。
网= dlnetwork(层);
定义模型损失函数
训练一个深层神经网络是一种优化的任务。通过考虑一个神经网络作为一个函数 ,在那里 网络输入和吗 可学的参数集,您可以优化吗 减少一些损失值基于训练数据。例如,优化可学的参数 这样,对于一个给定的输入 与相应的目标 ,他们之间的误差最小化预测 和 。
创建函数modelLoss
中列出,损失函数模型的例子中,这需要作为输入dlnetwork
对象,mini-batch输入数据与相应的目标,并返回损失,损失的梯度对可学的参数,和网络状态。
指定培训选项
火车五世mini-batch大小为128。指定的选项个优化。指定一个初始0.9 0.01学习速率和动量。尝试体验不同值的数量时代和学习速度。
numEpochs =5;miniBatchSize = 128;learnRate =
0.01;动量= 0.9;
评价模型验证数据每10迭代。
validationFrequency = 10;
定义过度拟合检查函数
创建函数checkForOverfitting
中列出,过度拟合检查功能部分的例子。这个函数需要度量包含训练和验证数据的准确性,并确定网络是否过度拟合通过检查如果验证精度比训练精度小于指定的阈值。
如果过度拟合率小于过度拟合阈值,那么网络过度拟合。指定一个过度拟合的阈值为0.9。
overFittingThreshold =
0.9;
火车模型
创建一个minibatchqueue
对象流程和管理mini-batches图像在训练。为每个mini-batch:
使用自定义mini-batch预处理功能
preprocessMiniBatch
(在这个例子中定义)转换编码的标签在一个炎热的变量。格式的图像数据维度标签
“SSCB”
(空间、空间、通道、批)。默认情况下,minibatchqueue
把数据转换为对象dlarray
对象与基本类型单
。没有格式的类标签。火车在GPU如果一个是可用的。默认情况下,
minibatchqueue
将每个输出转换为对象gpuArray
如果一个GPU是可用的。使用GPU需要并行计算工具箱™和支持GPU设备。金宝app支持设备的信息,请参阅金宝appGPU计算的需求(并行计算工具箱)。
兆贝可= minibatchqueue (augimdsTrain,…MiniBatchSize = MiniBatchSize,…MiniBatchFcn = @preprocessMiniBatch,…MiniBatchFormat = [“SSCB””“]);
个解算器初始化速度参数。
速度= [];
发现迭代的总数。
totalIterations = numEpochs *装天花板(augimdsTrain.NumObservations / miniBatchSize);
初始化TrainingProgressMonitor
对象。因为计时器开始创建监视器对象时,确保你创建对象接近的训练循环。
监控= trainingProgressMonitor (…指标= [“TrainingLoss”,“ValidationLoss”,“TrainingAccuracy”,“ValidationAccuracy”),…信息= [“时代”,“MaxEpochs”),…包含=“迭代”,…状态=“训练……”);groupSubPlot(监控、准确性= (“TrainingAccuracy”,“ValidationAccuracy”]);groupSubPlot(监视、损失= (“TrainingLoss”,“ValidationLoss”]);updateInfo(监视、MaxEpochs = numEpochs);
初始化使用的监控检查的培训信息showCheckOnPlot
函数定义的这个例子。的showCheckOnPlot
函数创建一个结构体
的信息,您可以使用更新过度拟合训练期间检查。
trainingCheck = showCheckOnPlot(监控、overFittingThreshold);
列车网络使用自定义训练循环。对于每一个时代,洗牌和遍历mini-batches数据的数据。为每个mini-batch:
损失评估模型,使用渐变和状态
dlfeval
和modelLoss
功能和更新网络状态。更新网络参数使用
sgdmupdate
函数。显示培训进展。
检查每个验证迭代过度拟合。
停止,如果
停止
房地产是正确的。的停止
属性值的TrainingProgressMonitor
真当你点击对象变化停止培训进度窗口按钮。
迭代= 0;时代= 0;%循环时期。而时代< numEpochs & & ~班长。停止时代=时代+ 1;%洗牌数据。洗牌(兆贝可);%在mini-batches循环。而hasdata(兆贝可)& & ~班长。停止iteration = iteration + 1;% mini-batch读取的数据。[X, T] =下一个(兆贝可);%损失评估模型,使用dlfeval和渐变和状态% modelLoss功能和更新网络状态。(损失、渐变、状态)= dlfeval (@modelLoss,净,X, T);网。=状态;%计算的训练精度。Y =预测(净,X);accuracyTrain = 100 *意味着(onehotdecode (Y,类,1)= = onehotdecode (T)类,1));%更新使用个优化网络参数。(净、速度)= sgdmupdate(净、渐变速度,learnRate动量);%显示培训进展。recordMetrics(监控、迭代…TrainingLoss =损失,…TrainingAccuracy = accuracyTrain);%计算验证精度。如果迭代1 = = | |国防部(迭代,validationFrequency) = = 0 [lossVal accuracyVal] = calculateValidationMetrics(网,augimdsValidation, miniBatchSize、类);recordMetrics(监控、迭代…ValidationAccuracy = accuracyVal,…ValidationLoss = lossVal);%检查模型是否过度拟合。trainingCheck = updateTrainingChecks(监控、trainingCheck);结束%更新培训进度条。班长。进步= 100 *迭代/ totalIterations;结束%更新培训进度监控的时代。updateInfo(监视、时代=时代);结束%设置最终状态监控。如果班长。停止班长。状态=“训练停止”;其他的班长。状态=“培训完成”;结束
检查过度拟合
找到最后一个值模型过度拟合的检查。
trainingCheck.LastValue
ans = 0
一个LastValue
值为0意味着模型过度拟合。为了防止过度拟合,试试以下的一个或多个:
随机数据
使用数据增加
使用辍学层
增加正则化因子。
在这个例子中,为了防止过度拟合,随机数据前培训。随机数据,指定“随机”
当使用splitEachLabel
函数。
[imdsTrain, imdsValidation] = splitEachLabel (imd, trainingProportion“随机”);
如果你训练模型的随机数据,然后通过过度拟合的模型检查。
金宝app支持功能
损失函数模型
的modelLoss
函数接受一个dlnetwork
对象净
mini-batch的输入数据X
与相应的目标T
并返回损失,损失的梯度参数对可学的净
,和网络状态。自动计算梯度,使用dlgradient
函数。
函数(损失、渐变、状态)= modelLoss(净,X, T)%通过网络转发数据。[Y,状态]=前进(净,X);%计算熵的损失。损失= crossentropy (Y, T);%计算梯度的损失对可学的参数。梯度= dlgradient(损失、net.Learnables);结束
验证指标函数
的calculateValidationMetrics
函数接受一个网络,augmentedImageDatastore
对象包含验证数据、mini-batch大小和类,并返回损失和验证数据的准确性。
函数(损失、准确性)= calculateValidationMetrics(净、augvalDatastore miniBatchSize,类)%通过批量验证数据通过网络。兆贝可= minibatchqueue (augvalDatastore,…MiniBatchSize = MiniBatchSize,…MiniBatchFcn = @preprocessMiniBatch,…MiniBatchFormat = [“SSCB”,”“]);T = [];Y = [];%在mini-batches循环。而hasdata(兆贝可)[X, batchT] =(兆贝可);%通过网络传递数据。batchY =预测(净,X);%附加到输出。Y = [Y, batchY];T = (T, batchT);结束%计算熵的损失。损失= crossentropy (Y, T);%计算的准确性。精度= 100 *意味着(onehotdecode (Y,类,1)= = onehotdecode (T)类,1));结束
Mini-Batch预处理功能
的preprocessMiniBatch
函数进行预处理的mini-batch预测和标签使用以下步骤:
使用预处理的图像
preprocessMiniBatchPredictors
函数。从传入单元阵列提取标签数据和连接到一个直言沿着二维数组。
一个炎热的分类标签编码成数字数组。编码的第一个维度产生一个相匹配的形状编码阵列网络输出。
函数[X, T] = preprocessMiniBatch (dataX人数()%预处理预测。X = preprocessMiniBatchPredictors (dataX);%从细胞中提取标签数据和连接。猫(T = 2,人数({1:结束});%一个炎热的编码标签。T = onehotencode (T, 1);结束
Mini-Batch预测预处理功能
的preprocessMiniBatchPredictors
函数进行预处理mini-batch预测因子的提取图像数据从输入单元阵列连接成一个数字数组。灰度输入,连接在第四维度添加每个图像的三维空间,作为一个单通道维度。
函数X = preprocessMiniBatchPredictors (dataX)%连接。猫(X = 4, dataX{1:结束});结束
初始化培训检查
的showCheckOnPlot
函数创建一个结构体
的信息,您可以使用更新过度拟合训练期间检查。
的名字
——显示名称检查的培训进度监控窗口。CheckFunction
——函数处理用来检查问题。有关更多信息,请参见checkForOverfitting
函数。
函数将检查添加到TrainingProgressMonitor
对象培训进度窗口并显示结果。您可以添加更多的检查结构体
通过定义并将其加入更多的检查功能结构体
。
函数trainingCheck = showCheckOnPlot(监控阈值)trainingCheck =结构(“名称”,“OverfittingCheck”,…“CheckFunction”@ (x) checkForOverfitting (x,阈值));%创建一个信息项培训进度监控%培训检查。班长。信息=[监视器。信息trainingCheck.Name];updateInfo(监控、trainingCheck.Name“❓未知”);结束
更新培训检查
的updateTrainingChecks
函数作为输入TrainingProgressMonitor
对象和一个培训检查。如果经过检查调用函数验证CheckFunction
和更新LastValue
与结果。如果检查通过,则检查值是1,没有发现问题。如果检查失败,然后检查值为0,并发现了一个问题。功能更新培训进度监控的最新结果。
函数trainingCheck trainingCheck = updateTrainingChecks(监控)%更新培训检查。检查= trainingCheck.CheckFunction (monitor.MetricData);如果检查= = 0%检查失败。updateInfo(监控、trainingCheck.Name“⚠️失败”);trainingCheck.LastValue=0;elseif检查= = 1%检查通过。updateInfo(监控、trainingCheck.Name“✔️通过”)trainingCheck。LastValue = 1;其他的%检查未经证实的。使用现有的价值%在信息领域。结束结束
过度拟合检查功能
这checkForOverfitting
函数度量包含训练和验证数据准确性和决定如果不过度拟合模型检查验证准确性训练准确性的比例是大于或等于给定的阈值。
函数结果= checkForOverfitting (metricData阈值)%设置训练点的数量平均检查。n = 10;%如果没有值的一个或其他培训或验证%精度,然后返回未知。trainingAccData = metricData.TrainingAccuracy;如果大小(trainingAccData 1) < = 1 n结果;其他的%的检查比去年验证精度%的平均过去“n”的训练精度%大于所选阈值。avgTrainAcc =意味着(trainingAccData (end-n + 1:结束);validationAccData = metricData.ValidationAccuracy;lastValidationAccPoint = validationAccData(结束:);结果= lastValidationAccPoint (2) / avgTrainAcc > =阈值;结束结束
另请参阅
dlfeval
|dlnetwork
|minibatchqueue
|trainingProgressMonitor