主要内容

比较激活层

这个例子展示了如何比较训练网络与ReLU、leaky ReLU、ELU和swish激活层的准确性。

训练深度学习神经网络需要使用非线性激活函数,如ReLU和swish操作。一些激活层可以以额外的计算时间为代价获得更好的训练性能。在训练神经网络时,你可以尝试使用不同的激活层,看看训练是否有所改善。

这个例子展示了当你使用ReLU、leaky ReLU、ELU或swish激活层给出一组验证图像时,如何比较训练SqueezeNet神经网络的验证准确性。

加载数据

下载Flowers数据集。

url =“http://download.tensorflow.org/example_images/flower_photos.tgz”;downloadFolder = tempdir;文件名= fullfile(下载文件夹,“flower_dataset.tgz”);dataFolder = fullfile(下载文件夹,“flower_photos”);如果~存在(dataFolder“dir”)流("正在下载Flowers数据集(218 MB)…") websave(文件名,url);解压(文件名,downloadFolder)流(“完成。\ n”结束

为培训准备数据

方法将数据加载为映像数据存储imageDatastore函数并指定包含图像数据的文件夹。

imds = imageDatastore(数据文件夹,...“IncludeSubfolders”,真的,...“LabelSource”“foldernames”);

查看训练数据的类数。

numClasses = nummel(类别(imds.Labels))
numClasses = 5

对数据存储进行划分,使训练集中的每个类别拥有80%的图像,验证集拥有每个标签的剩余图像。

[imdsTrain,imdsValidation] = splitEachLabel(imds,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验证一次神经网络。

miniBatchSize = 128;numObservationsTrain = numel(imdsTrain.Files);numIterationsPerEpoch = floor(numObservationsTrain / miniBatchSize);选项= trainingOptions(“亚当”...“MiniBatchSize”miniBatchSize,...“MaxEpochs”现年60岁的...“洗牌”“every-epoch”...“ValidationData”augimdsValidation,...“ValidationFrequency”numIterationsPerEpoch,...“详细”、假);

训练神经网络

对于每一种激活层类型——ReLU、leaky ReLU、ELU和swish——训练一个SqueezeNet网络。

指定激活层的类型。

activationLayerTypes = [“relu”“leaky-relu”“elu”“漂亮”];

通过创建带有指定颜色的动画线来初始化自定义的训练进度图colororder函数。

图颜色= colororder;i = 1: nummel (activationLayerTypes) line(i) = animatedline(“颜色”、颜色(我,:));结束ylim([0 100]) legend(activationLayerTypes,“位置”“东南”);包含(“迭代”) ylabel (“准确性”)标题(“验证准确性”网格)

遍历每个激活层类型并训练神经网络。对于每个激活层类型:

  • 创建一个函数句柄activationLayer这就创建了激活层。

  • 创建一个新的无权重的SqueezeNet网络,并使用函数句柄将激活层(ReLU层)替换为激活层类型的层activationLayer

  • 将神经网络的最后一个卷积层替换为指定输入数据的类数的卷积层。

  • 方法更新验证精度图OutputFcn属性的函数句柄updatePlot函数使用对应于激活层类型的动画线。

  • 对网络进行训练和计时trainNetwork函数。

i = 1:numel(activationLayerTypes) activationLayerType = activationLayerTypes(i);确定激活层类型。开关activationLayerType情况下“relu”activationLayer = @ relullayer;情况下“leaky-relu”activationLayer = @ leakyrelullayer;情况下“elu”activationLayer = @ elullayer;情况下“漂亮”activationLayer = @swishLayer;结束创建SqueezeNet图层图。挤压板(“重量”“没有”);替换激活层。如果activationLayerType ~ =“relu”layers = lgraph.Layers;J = 1:数值(层数)如果isa(层(j),“nnet.cnn.layer.ReLULayer”) layerName = layers(j).Name;层=激活层(“名字”activationLayerType +“_new_”+ j);lgraph = replaceLayer(lgraph,layerName,layer);结束结束结束指定最后卷积层的类数。layer = convolution2dLayer([1 1],numClasses,“名字”“conv10”);lgraph =替换层(lgraph,“conv10”层);指定自定义绘图函数。选项。OutputFcn = @(info) updatePlot(info,line(i));培训网络。开始= tic;[net{i},info{i}] = trainNetwork(augimdsTrain,lgraph,options);消失(i) = toc(开始);结束

在条形图中可视化训练时间。

figure bar(categorical(activationLayerTypes),elapsed)“培训时间”) ylabel (“时间(秒)”

在这种情况下,使用不同的激活层产生类似的最终验证精度,泄漏的ReLU和swish层具有略高的值。使用swish激活层可以在更少的迭代中实现收敛。与其他激活层相比,使用ELU层使得验证精度收敛于更多的迭代,需要更多的计算时间。

绘图函数

updatePlot函数将信息结构作为输入信息并更新由动画线指定的验证图

函数updatePlot(信息、线)如果~ isempty (info.ValidationAccuracy) addpoints(线,info.Iteration, info.ValidationAccuracy);drawnowlimitrate结束结束

另请参阅

||||

相关的话题