main content

使用自动多 gpu 支持训练网络 -凯发k8网页登录

此示例说明如何使用自动并行支持在本地计算机上使用多个 gpu 进行深度学习训练。

训练深度学习网络通常需要几个小时或几天的时间。借助并行计算,您可以使用多个 gpu 加快训练速度。要了解有关并行训练选项的详细信息,请参阅。

要求

在运行此示例之前,您必须将 cifar-10 数据集下载到本地计算机。要下载 cifar-10 数据集,请使用 downloadcifartofolders 函数,此函数作为支持文件包含在此示例中。要访问此文件,请以实时脚本形式打开此示例。使用以下代码将该数据集下载到您的当前目录。如果您已有 cifar-10 的本地副本,则可以略过本节。

directory = pwd;
[locationcifar10train,locationcifar10test] = downloadcifartofolders(directory);
downloading cifar-10 data set...done.
copying cifar-10 to folders...done.

加载数据集

使用 imagedatastore 对象加载训练和测试数据集。在以下代码中,确保数据存储的位置指向本地计算机中的 cifar-10。

imdstrain = imagedatastore(locationcifar10train, ...
 includesubfolders=true, ...
 labelsource="foldernames");
imdstest = imagedatastore(locationcifar10test, ...
 includesubfolders=true, ...
 labelsource="foldernames");

要使用增强的图像数据训练网络,请创建 augmentedimagedatastore 对象。使用随机平移和水平翻转。数据增强有助于防止网络过拟合和记忆训练图像的具体细节。

imagesize = [32 32 3];
pixelrange = [-4 4];
imageaugmenter = imagedataaugmenter( ...
    randxreflection=true, ...
    randxtranslation=pixelrange, ...
    randytranslation=pixelrange);
augmentedimdstrain = augmentedimagedatastore(imagesize,imdstrain, ...
    dataaugmentation=imageaugmenter);

定义网络架构和训练选项

为 cifar-10 数据集定义一个网络架构。为了简化代码,使用对输入进行卷积的卷积块。池化层对空间维度进行下采样。

blockdepth = 4; % blockdepth controls the depth of a convolutional block.
netwidth = 32; % netwidth controls the number of filters in a convolutional block.
layers = [
    imageinputlayer(imagesize) 
    
    convolutionalblock(netwidth,blockdepth)
    maxpooling2dlayer(2,stride=2)
    convolutionalblock(2*netwidth,blockdepth)
    maxpooling2dlayer(2,stride=2)    
    convolutionalblock(4*netwidth,blockdepth)
    averagepooling2dlayer(8) 
    
    fullyconnectedlayer(10)
    softmaxlayer
    classificationlayer
];

定义训练选项。通过将执行环境设置为 multi-gpu 使用多个 gpu 并行训练网络。当您使用多个 gpu 时,就增加了可用的计算资源。根据 gpu 的数量扩大小批量大小,以保持每个 gpu 上的工作负载不变。在此示例中,gpu 的数量是四个。根据小批量大小缩放学习率。使用学习率调度,以随着训练的进行降低学习率。打开训练进度图可在训练过程中获得可视化的反馈数据。

numgpus = gpudevicecount("available")
numgpus = 4
minibatchsize = 256*numgpus;
initiallearnrate = 1e-1*minibatchsize/256;
options = trainingoptions("sgdm", ...
    executionenvironment="multi-gpu", ... % turn on automatic multi-gpu support.
    initiallearnrate=initiallearnrate, ... % set the initial learning rate.
    minibatchsize=minibatchsize, ... % set the minibatchsize.
    verbose=false, ... % do not send command line output.
    plots="training-progress", ... % turn on the training progress plot.
    l2regularization=1e-10, ...
    maxepochs=60, ...
    shuffle="every-epoch", ...
    validationdata=imdstest, ...
    validationfrequency=floor(numel(imdstrain.files)/minibatchsize), ...
    learnrateschedule="piecewise", ...
    learnratedropfactor=0.1, ...
    learnratedropperiod=50);

训练网络及其分类使用

训练网络。在训练过程中,绘图将会显示进度。

net = trainnetwork(augmentedimdstrain,layers,options)
starting parallel pool (parpool) using the 'processes' profile ...
connected to the parallel pool (number of workers: 4).

net = 
  seriesnetwork with properties:
         layers: [43×1 nnet.cnn.layer.layer]
     inputnames: {'imageinput'}
    outputnames: {'classoutput'}

通过使用经过训练的网络对本地计算机上的测试图像进行分类,确定网络的准确度。然后将预测的标签与实际标签进行比较。

ypredicted = classify(net,imdstest);
accuracy = sum(ypredicted == imdstest.labels)/numel(imdstest.labels)
accuracy = 0.8972

自动多 gpu 支持可以利用多个 gpu 来加快网络训练速度。下图显示在具有四个 nvidia© titan xp gpu 的 linux 计算机上,gpu 的数量对整个训练时间的加速情况。

定义辅助函数

定义一个函数,以便在网络架构中创建卷积块。

function layers = convolutionalblock(numfilters,numconvlayers)
    layers = [
        convolution2dlayer(3,numfilters,padding="same")
        batchnormalizationlayer
        relulayer];
    
    layers = repmat(layers,numconvlayers,1);
end

另请参阅

| |

相关主题

    网站地图