比较激活层
这个例子展示了如何比较训练网络与ReLU,泄漏ReLU, ELU和swish激活层的准确性。
训练深度学习神经网络需要使用非线性激活函数,如ReLU和swish操作。一些激活层可以以额外的计算时间为代价获得更好的训练性能。当训练一个神经网络时,你可以尝试使用不同的激活层来看看训练是否有所改善。
这个例子展示了在给定一组图像的验证集中,当使用ReLU、漏式ReLU、ELU或swish激活层时,如何比较训练SqueezeNet神经网络的验证准确性。
加载数据
下载Flowers数据集。
url =“http://download.tensorflow.org/example_images/flower_photos.tgz”;downloadFolder = tempdir;文件名= fullfile (downloadFolder,“flower_dataset.tgz”);dataFolder = fullfile (downloadFolder,“flower_photos”);如果~存在(dataFolder“dir”)流(“正在下载Flowers数据集(218 MB)…”) websave(文件名,url);解压(文件名,downloadFolder)流(“完成。\ n”)结束
为培训准备数据
方法将数据加载为映像数据存储imageDatastore
函数并指定包含图像数据的文件夹。
imd = imageDatastore (dataFolder,...“IncludeSubfolders”,真的,...“LabelSource”,“foldernames”);
查看培训数据的类数。
numClasses =元素个数(类别(imds.Labels))
numClasses = 5
划分数据存储,使训练集中的每个类别拥有80%的图像,而验证集拥有来自每个标签的剩余图像。
[imdsTrain, imdsValidation] = splitEachLabel (imd, 0.80,“随机”);
指定增强选项并创建包含训练图像的增强图像数据存储。
在水平轴上随机反射图像。
随机缩放图像至20%。
随机旋转图像最多45度。
随机翻译图像最多3个像素。
将图像调整为网络的输入大小(227 * 227)。
imageAugmenter = imageDataAugmenter (...“RandXReflection”,真的,...“RandScale”(0.8 - 1.2),...“RandRotation”(-45年,45岁),...“RandXTranslation”3 [3],...“RandYTranslation”3 [3]);augimdsTrain = augmentedImageDatastore([227 227],imdsTrain,“DataAugmentation”, imageAugmenter);
为验证数据创建一个增强的图像数据存储,该数据存储将图像调整为网络的输入大小。不要对验证数据应用任何其他图像转换。
augimdsValidation = augmentedImageDatastore([227 227],imdsValidation);
创建自定义绘图功能
在训练多个网络时,要监视同一轴上每个网络的验证精度,可以使用OutputFcn
训练选项,并指定用提供的训练信息更新绘图的函数。
创建一个函数,接受训练过程提供的信息结构,并更新动画线形图。的updatePlot
函数中列出的绘图函数部分,将信息结构作为输入并更新指定的动画行。
指定培训选项
指定培训选项:
训练使用128的小批次大小为60课时。
每个历元打乱数据。
每个epoch使用hold out验证集验证一次神经网络。
miniBatchSize = 128;numObservationsTrain =元素个数(imdsTrain.Files);numIterationsPerEpoch = floor(numObservationsTrain / miniBatchSize);选择= trainingOptions (“亚当”,...“MiniBatchSize”miniBatchSize,...“MaxEpochs”现年60岁的...“洗牌”,“every-epoch”,...“ValidationData”augimdsValidation,...“ValidationFrequency”numIterationsPerEpoch,...“详细”、假);
训练神经网络
对于每一种激活层类型—ReLU、漏式ReLU、ELU和sway—训练一个SqueezeNet网络。
指定激活层的类型。
activationLayerTypes = [“relu”“leaky-relu”“elu”“漂亮”];
通过创建带有指定颜色的动画线来初始化自定义训练进度图colororder
函数。
图色=色序;为i = 1:numel(activationLayerTypes) line(i) = animatedline(“颜色”、颜色(我,:));结束ylim(100[0])传说(activationLayerTypes,“位置”,“东南”);包含(“迭代”) ylabel (“准确性”)标题(“验证准确性”网格)在
循环每一个激活层类型并训练神经网络。对于每个激活层类型:
创建一个函数句柄
activationLayer
这就创建了激活层。创建一个新的不带权重的SqueezeNet网络,并使用函数句柄将激活层(ReLU层)替换为激活层类型的层
activationLayer
.将神经网络的最后一个卷积层替换为指定输入数据的类数的卷积层。
通过设置更新验证精度图
OutputFcn
属性的函数句柄updatePlot
函数使用与激活层类型对应的动画线。训练和计时网络使用
trainNetwork
函数。
为i = 1:numel(activationLayerTypes) activationLayerType = activationLayerTypes(i);确定激活层类型。开关activationLayerType情况下“relu”activationLayer = @reluLayer;情况下“leaky-relu”activationLayer = @leakyReluLayer;情况下“elu”activationLayer = @eluLayer;情况下“漂亮”activationLayer = @swishLayer;结束创建SqueezeNet图层图。lgraph = squeezenet (“重量”,“没有”);替换激活层。如果activationLayerType ~ =“relu”层= lgraph.Layers;为j = 1:元素个数(层)如果isa(层(j),“nnet.cnn.layer.ReLULayer”) layerName = layers(j).Name;层= activationLayer (“名字”activationLayerType +“_new_”+ j);lgraph = replaceLayer (lgraph、layerName层);结束结束结束指定最终卷积层的类数。layer = convolution2dLayer([1 1],numClasses,“名字”,“conv10”);lgraph = replaceLayer (lgraph,“conv10”层);指定自定义绘图函数。选项。OutputFcn = @(info) updatePlot(info,line(i));训练网络。开始=抽搐;(净{我},信息{我}]= trainNetwork (augimdsTrain、lgraph选项);运行(i) = toc(开始);结束
在条形图中可视化训练时间。
图酒吧(分类(activationLayerTypes),运行)标题(“培训时间”) ylabel (“时间(秒)”)
在这种情况下,使用不同的激活层产生相似的最终验证精度,泄漏的ReLU和swish层的值略高。使用swish激活层可以在更少的迭代中实现收敛。与其他激活层相比,使用ELU层使验证精度收敛于更多的迭代,需要更多的计算时间。
绘图函数
的updatePlot
函数以信息结构作为输入信息
并更新由动画行指定的验证图行
.
函数updatePlot(信息、线)如果~ isempty (info.ValidationAccuracy) addpoints(线,info.Iteration, info.ValidationAccuracy);drawnowlimitrate结束结束
另请参阅
trainingOptions
|trainNetwork
|reluLayer
|leakyReluLayer
|swishLayer