文档帮助中心
计算深度学习网络输出用于训练
海底=前进(dlnet dlX)
海底=前进(dlXM dlnet, dlX1,…)
[dlY1,…,dlYN]= (___)
[dlY1,…,dlYK]= (___、“输出”layerNames)
(___、州]= (___)
一些深度学习层在训练和推断(预测)时表现不同。例如,在训练过程中,dropout层将输入元素随机设置为零,以帮助防止过拟合,但在推理过程中,dropout层并不更改输入。
要计算用于训练的网络输出,请使用向前函数。要计算用于推理的网络输出,请使用预测函数。
向前
预测
例子
海底= (dlnet,dlX)返回网络输出海底在培训期间给定输入数据dlX。
海底= (dlnet,dlX)
海底
dlnet
dlX
海底= (dlnet、dlX1 dlXM……)返回网络输出海底在培训期间米输入dlX1,…, dlXM和网络dlnet有米输入和单个输出。
海底= (dlnet、dlX1 dlXM……)
米
dlX1,…, dlXM
[dlY1,…,dlYN]= (___)返回N输出dlY1、……dlYN在培训网络的时候N使用任何以前的语法输出。
N
dlY1
dlYN
[dlY1,…,dlYK]= (___“输出”,layerNames)返回输出dlY1、……dlYK在使用前面的任何语法训练指定的层时。
[dlY1,…,dlYK]= (___“输出”,layerNames)
layerNames
dlYK
(___,状态]= (___)还使用以前的任何语法返回更新后的网络状态。
(___,状态]= (___)
状态
全部折叠
这个例子展示了如何训练一个使用自定义学习率时间表对手写数字进行分类的网络。
如果trainingOptions不提供您需要的选项(例如,自定义学习率计划),那么您可以使用自动区分来定义您自己的自定义训练循环。
trainingOptions
这个例子训练了一个网络来分类手写数字基于时间的衰减学习率时间表:对于每次迭代,求解器使用给定的学习率 ρ t = ρ 0 1 + k t ,在那里t为迭代次数, ρ 0 初始学习率是多少k是衰减的。
负荷训练数据
加载数字数据。
[XTrain, YTrain] = digitTrain4DArrayData;类=类别(YTrain);numClasses =元素个数(类);
定义网络
属性定义网络并指定平均映像“的意思是”选项在图像输入层。
“的意思是”
[imageInputLayer([28 28 1]),“名字”,“输入”,“的意思是”, mean(XTrain,4))卷积2dlayer (5,20,“名字”,“conv1”)batchNormalizationLayer (“名字”,“bn1”)reluLayer (“名字”,“relu1”20岁的)convolution2dLayer (3“填充”,1“名字”,“conv2”)batchNormalizationLayer (“名字”,“bn2”)reluLayer (“名字”,“relu2”20岁的)convolution2dLayer (3“填充”,1“名字”,“conv3”)batchNormalizationLayer (“名字”,“bn3”)reluLayer (“名字”,“relu3”)fullyConnectedLayer (numClasses“名字”,“俱乐部”)softmaxLayer (“名字”,“softmax”));lgraph = layerGraph(层);
创建一个dlnetwork对象从层图。
dlnetwork
dlnet = dlnetwork (lgraph)
可学习表:[14×3表]状态:[6×3表]InputNames: {'input'} OutputNames: {'softmax'}
定义模型梯度函数
创建函数modelGradients,在示例的最后列出,它采用dlnetwork对象dlnet,一小批输入数据dlX与相应的标签Y并返回关于可学习参数的损失的梯度dlnet以及相应的损失。
modelGradients
Y
指定培训选项
火车与一个小批量的128为5个epoch。
numEpochs = 5;miniBatchSize = 128;
为SGDM优化指定选项。指定初始学习率为0.01,衰减为0.01,动量为0.9。
initialLearnRate = 0.01;衰变= 0.01;动量= 0.9;
在一个情节中可视化训练进程。
情节=“训练进步”;
如果有的话,在GPU上进行训练。使用GPU需要Parallel Computing Toolbox™和支持CUDA®的NVIDIA®GPU,计算能力为3.0或更高。
executionEnvironment =“汽车”;
火车模型
使用自定义训练循环训练模型。
对于每个纪元,洗牌数据和循环数据的小批。在每个阶段结束时,显示训练进度。
为每个mini-batch:
将标签转换为哑变量。
将数据转换为dlarray对象的基础类型为single,并指定维度标签“SSCB”(空间、空间、通道、批处理)
dlarray
“SSCB”
对于GPU训练,转换为gpuArray对象。
gpuArray
评估模型梯度,状态和损失使用dlfeval和modelGradients函数和更新网络状态。
dlfeval
确定基于时间的衰减学习速率计划的学习速率。
属性更新网络参数sgdmupdate函数。
sgdmupdate
初始化训练进度图。
如果情节= =“训练进步”图形lineLossTrain = animatedline(“颜色”[0.85 0.325 0.098]);ylim([0正])包含(“迭代”)ylabel (“损失”网格)在结束
初始化SGDM求解器的速度参数。
速度= [];
培训网络。
numObservations =元素个数(YTrain);numIterationsPerEpoch =地板(numObservations. / miniBatchSize);迭代= 0;开始=抽搐;循环周期。为时代= 1:numEpochs%洗牌数据。idx = randperm(元素个数(YTrain));XTrain = XTrain (:,:,:, idx);YTrain = YTrain (idx);在小批中循环。为i = 1:numIterationsPerEpoch iteration = iteration + 1;%读取小批数据,并将标签转换为假的%变量。idx =(张)* miniBatchSize + 1:我* miniBatchSize;X = XTrain (:,:,:, idx);(numClasses, miniBatchSize,“单一”);为1:numClasses Y(c,YTrain(idx))==classes(c)) = 1;结束%转换小批数据到dlarray。dlX = dlarray(单(X),“SSCB”);在GPU上进行训练,然后将数据转换为gpuArray。如果(executionEnvironment = =“汽车”&& canUseGPU) b| executionEnvironment ==“图形”dlX = gpuArray (dlX);结束%使用dlfeval和the评估模型梯度、状态和损失% modelGradients函数和更新网络状态。(渐变、州损失)= dlfeval (@modelGradients, dlnet dlX Y);dlnet。状态=状态;%确定基于时间的衰减学习速率计划的学习速率。learnRate = initialLearnRate/(1 +衰变*迭代);%使用SGDM优化器更新网络参数。[dlnet, velocity] = sgdmupdate(dlnet, gradient, velocity, learnRate, momentum);显示训练进度。如果情节= =“训练进步”D =持续时间(0,0,toc(开始),“格式”,“hh: mm: ss”);addpoints (lineLossTrain、迭代、双(收集(extractdata(损失))))标题(”时代:“+时代+”,过去:“+ drawnow字符串(D))结束结束结束
测试模型
通过比较测试集上的预测值和真实标签来测试模型的分类精度。
[XTest, YTest] = digitTest4DArrayData;
将数据转换为dlarray具有尺寸格式的对象“SSCB”。对于GPU预测,也转换数据到gpuArray。
dlXTest = dlarray (XTest,“SSCB”);如果(executionEnvironment = =“汽车”&& canUseGPU) b| executionEnvironment ==“图形”dlXTest = gpuArray (dlXTest);结束
使用以下方法对图像进行分类modelPredictions函数,并在示例的最后列出,查找得分最高的类。
modelPredictions
dlYPred = modelPredictions (dlnet dlXTest miniBatchSize);[~,idx] = max (extractdata (dlYPred), [], 1);YPred =类(idx);
评估分类精度。
准确度=均值(YPred == YTest)
精度= 0.9910
模型梯度函数
的modelGradients函数接受一个dlnetwork对象dlnet,一小批输入数据dlX与相应的标签Y并返回关于可学习参数的损失的梯度dlnet,网络状态,和损失。要自动计算梯度,请使用dlgradient函数。
dlgradient
函数[gradient,state,loss] = modelGradients(dlnet,dlX,Y) [dlYPred,state] = forward(dlnet,dlX);损失= crossentropy (dlYPred Y);梯度= dlgradient(损失、dlnet.Learnables);结束
模型的预测函数
的modelPredictions函数接受一个dlnetwork对象dlnet,输入数据数组dlX,并通过遍历指定大小的微型批处理输出模型预测。
函数numObservations = size(dlX,4);numiteration = ceil(numObservations / miniBatchSize);numClasses = dlnet.Layers .OutputSize (11);dlYPred = 0 (numClasses numObservations,“喜欢”dlX);为i = 1:numIterations idx = (i-1)*miniBatchSize+1:min(i*miniBatchSize,numObservations);dlYPred (:, idx) =预测(dlnet, dlX (:,:,:, idx));结束结束
网络的自定义训练循环,指定为dlnetwork对象。
输入数据,指定为格式化dlarray。有关dlarray格式,请参见fmt输入参数的dlarray。
fmt
层提取输出,指定为包含层名称的字符串数组或字符向量的单元数组。
如果layerNames(我)对应一个具有单个输出的层,然后layerNames(我)是层的名称。
layerNames(我)
如果layerNames(我)对应具有多个输出的层,则layerNames(我)是层名后跟字符"/和输出的图层名称:“layerName / outputName”。
/
“layerName / outputName”
输出数据,作为格式化返回dlarray。有关dlarray格式,请参见fmt输入参数的dlarray。
更新的网络状态,作为表返回。
网络状态是一个有三列的表:
层-层名称,指定为字符串标量。
层
参数-参数名称,指定为字符串标量。
参数
价值-参数的值,指定为数值数组对象。
价值
网络状态包含迭代之间由网络记住的信息。例如,LSTM和批处理规范化层的状态。
更新a的状态dlnetwork使用状态财产。
用法说明和限制:
如果满足以下任一条件或同时满足以下任一条件,则该函数在GPU上运行:
网络内部可学习参数的任意值dlnet.Learnables.Value是dlarray具有底层数据类型的对象gpuArray
dlnet.Learnables.Value
输入参数dlX是一个dlarray底层数据类型gpuArray
有关更多信息,请参见在GPU上运行MATLAB函数(并行计算工具箱)。
dlarray|dlfeval|dlgradient|dlnetwork|预测
您的系统上有此示例的修改版本。你想打开这个版本吗?
您点击了对应于以下MATLAB命令的链接:
通过在MATLAB命令窗口中输入该命令来运行该命令。Web浏览器不支持MATLAB命令。金宝app
选择一个网站,在可用的地方获得翻译内容,并查看当地的活动和优惠。根据您的位置,我们建议您选择:。
您也可以从以下列表中选择网站:
选择中国网站(中文或英文)以获得最佳网站性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。
与当地办事处联系