比较激活层
这个例子展示了如何比较训练网络与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结束结束
另请参阅
trainingOptions
|trainNetwork
|reluLayer
|leakyReluLayer
|swishLayer