主要内容

比较激活层

这个例子展示了如何比较训练网络与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结束结束

另请参阅

||||

相关的话题

Baidu
map