Main Content

alexnet

AlexNet 卷积神经网络

  • AlexNet network architecture

说明

AlexNet 是深度为 8 层的卷积神经网络。您可以从 ImageNet 数据库 [1] 中加载该网络的预训练版本,该版本基于 ImageNet 数据库的超过一百万个图像进行训练。该预训练网络可以将图像分类至 1000 个目标类别(例如键盘、鼠标、铅笔和多种动物)。因此,该网络已基于大量图像学习了丰富的特征表示。该网络的图像输入大小为 227×227。有关 MATLAB® 中预训练网络的详细信息,请参阅预训练的深度神经网络

您可以通过 AlexNet 网络使用 classify 对新图像进行分类。按照使用 GoogLeNet 对图像进行分类的步骤,但是用 AlexNet 替换 GoogLeNet。

有关实际深度学习方法的免费实践课程,请参阅深度学习入门之旅

示例

net = alexnet 返回基于 ImageNet 数据集训练的 AlexNet 网络。

此函数需要 Deep Learning Toolbox™ Model for AlexNet Network 支持包。如果未安装此支持包,函数会提供下载链接。或者,参阅 Deep Learning Toolbox Model for AlexNet Network

有关 MATLAB 中预训练网络的详细信息,请参阅预训练的深度神经网络

net = alexnet('Weights','imagenet') 返回基于 ImageNet 数据集训练的 AlexNet 网络。此语法等效于 net = alexnet

layers = alexnet('Weights','none') 返回未经训练的 AlexNet 网络架构。未经训练的模型不需要支持包。

示例

全部折叠

下载并安装 Deep Learning Toolbox Model for AlexNet Network 支持包。

在命令行中键入 alexnet

alexnet

如果未安装 Deep Learning Toolbox Model for AlexNet Network 支持包,该函数将在附加功能资源管理器中提供所需支持包的链接。要安装支持包,请点击链接,然后点击安装。通过在命令行中键入 alexnet 来检查安装是否成功。

alexnet
ans = 

  SeriesNetwork with properties:

    Layers: [25×1 nnet.cnn.layer.Layer]

如果安装了所需的支持包,则该函数返回 SeriesNetwork 对象。

使用深度网络设计器可视化网络。

deepNetworkDesigner(alexnet)

通过点击新建,在深度网络设计器中浏览其他预训练神经网络。

Deep Network Designer start page showing available pretrained neural networks

如果需要下载一个神经网络,请在所需的神经网络上暂停,然后点击安装以打开附加功能资源管理器。

此示例说明如何微调预训练的 AlexNet 卷积神经网络以对新的图像集合执行分类。

AlexNet 已基于超过一百万个图像进行训练,可以将图像分为 1000 个对象类别(例如键盘、咖啡杯、铅笔和多种动物)。该网络已基于大量图像学习了丰富的特征表示。网络以图像作为输入,然后输出图像中对象的标签以及每个对象类别的概率。

深度学习应用中常常用到迁移学习。您可以采用预训练的网络,基于它学习新任务。与使用随机初始化的权重从头训练网络相比,通过迁移学习微调网络要更快更简单。您可以使用较少数量的训练图像快速地将已学习的特征迁移到新任务。

加载数据

解压缩新图像并加载这些图像作为图像数据存储。imageDatastore 根据文件夹名称自动标注图像,并将数据存储为 ImageDatastore 对象。通过图像数据存储可以存储大图像数据,包括无法放入内存的数据,并在卷积神经网络的训练过程中高效分批读取图像。

unzip('MerchData.zip');
imds = imageDatastore('MerchData', ...
    'IncludeSubfolders',true, ...
    'LabelSource','foldernames');

将数据划分为训练数据集和验证数据集。将 70% 的图像用于训练,30% 的图像用于验证。splitEachLabelimages 数据存储拆分为两个新的数据存储。

[imdsTrain,imdsValidation] = splitEachLabel(imds,0.7,'randomized');

这个非常小的数据集现在包含 55 个训练图像和 20 个验证图像。显示一些示例图像。

numTrainImages = numel(imdsTrain.Labels);
idx = randperm(numTrainImages,16);
figure
for i = 1:16
    subplot(4,4,i)
    I = readimage(imdsTrain,idx(i));
    imshow(I)
end

加载预训练网络

加载预训练的 AlexNet 神经网络。如果未安装 Deep Learning Toolbox™ Model for AlexNet Network,则软件会提供下载链接。AlexNet 已基于超过一百万个图像进行训练,可以将图像分为 1000 个对象类别(例如键盘、鼠标、铅笔和多种动物)。因此,该模型已基于大量图像学习了丰富的特征表示。

net = alexnet;

使用 analyzeNetwork 可以交互可视方式呈现网络架构以及有关网络层的详细信息。

analyzeNetwork(net)

第一层(图像输入层)需要大小为 227×227×3 的输入图像,其中 3 是颜色通道数。

inputSize = net.Layers(1).InputSize
inputSize = 1×3

   227   227     3

替换最终层

预训练网络 net 的最后三层针对 1000 个类进行配置。必须针对新分类问题微调这三个层。从预训练网络中提取除最后三层之外的所有层。

layersTransfer = net.Layers(1:end-3);

通过将最后三层替换为全连接层、softmax 层和分类输出层,将层迁移到新分类任务。根据新数据指定新的全连接层的选项。将全连接层设置为大小与新数据中的类数相同。要使新层中的学习速度快于迁移的层,请增大全连接层的 WeightLearnRateFactorBiasLearnRateFactor 值。

numClasses = numel(categories(imdsTrain.Labels))
numClasses = 5
layers = [
    layersTransfer
    fullyConnectedLayer(numClasses,'WeightLearnRateFactor',20,'BiasLearnRateFactor',20)
    softmaxLayer
    classificationLayer];

训练网络

网络要求输入图像的大小为 227×227×3,但图像数据存储中的图像具有不同大小。使用增强的图像数据存储可自动调整训练图像的大小。指定要对训练图像额外执行的增强操作:沿垂直轴随机翻转训练图像,以及在水平和垂直方向上随机平移训练图像最多 30 个像素。数据增强有助于防止网络过拟合和记忆训练图像的具体细节。

pixelRange = [-30 30];
imageAugmenter = imageDataAugmenter( ...
    'RandXReflection',true, ...
    'RandXTranslation',pixelRange, ...
    'RandYTranslation',pixelRange);
augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain, ...
    'DataAugmentation',imageAugmenter);

要在不执行进一步数据增强的情况下自动调整验证图像的大小,请使用增强的图像数据存储,而不指定任何其他预处理操作。

augimdsValidation = augmentedImageDatastore(inputSize(1:2),imdsValidation);

指定训练选项。对于迁移学习,请保留预训练网络的较浅层中的特征(迁移的层权重)。要减慢迁移的层中的学习速度,请将初始学习速率设置为较小的值。在上一步中,您增大了全连接层的学习率因子,以加快新的最终层中的学习速度。这种学习率设置组合只会加快新层中的学习速度,对于其他层则会减慢学习速度。执行迁移学习时,所需的训练轮数相对较少。一轮训练是对整个训练数据集的一个完整训练周期。指定小批量大小和验证数据。软件在训练过程中每 ValidationFrequency 次迭代验证一次网络。

options = trainingOptions('sgdm', ...
    'MiniBatchSize',10, ...
    'MaxEpochs',6, ...
    'InitialLearnRate',1e-4, ...
    'Shuffle','every-epoch', ...
    'ValidationData',augimdsValidation, ...
    'ValidationFrequency',3, ...
    'Verbose',false, ...
    'Plots','training-progress');

训练由迁移层和新层组成的网络。默认情况下,trainNetwork 使用 GPU(如果有),否则使用 CPU。在 GPU 上训练需要 Parallel Computing Toolbox™ 和支持的 GPU 设备。有关受支持设备的信息,请参阅GPU Computing Requirements (Parallel Computing Toolbox)。您还可以使用 trainingOptions'ExecutionEnvironment' 名称-值对组参数指定执行环境。

netTransfer = trainNetwork(augimdsTrain,layers,options);

对验证图像进行分类

使用经过微调的网络对验证图像进行分类。

[YPred,scores] = classify(netTransfer,augimdsValidation);

显示四个示例验证图像及预测的标签。

idx = randperm(numel(imdsValidation.Files),4);
figure
for i = 1:4
    subplot(2,2,i)
    I = readimage(imdsValidation,idx(i));
    imshow(I)
    label = YPred(idx(i));
    title(string(label));
end

计算针对验证集的分类准确度。准确度是网络预测正确的标签的比例。

YValidation = imdsValidation.Labels;
accuracy = mean(YPred == YValidation)
accuracy = 1

有关提高分类准确度的提示,请参阅Deep Learning Tips and Tricks

使用 AlexNet 对图像进行读取、调整大小和分类。首先,加载一个预训练的 AlexNet 模型。

net = alexnet;

使用 imread 读取图像。

I = imread('peppers.png');
figure
imshow(I)

预训练模型要求图像大小与网络的输入大小相同。使用网络第一层的 InputSize 属性确定网络的输入大小。

sz = net.Layers(1).InputSize
sz = 1×3

   227   227     3

将图像大小调整为网络的输入大小。

I = imresize(I,sz(1:2));
figure
imshow(I)

使用 classify 对图像进行分类。

label = classify(net,I)
label = categorical
     bell pepper 

将图像和分类结果一起显示。

figure
imshow(I)
title(label)

此示例说明如何从预训练的卷积神经网络中提取已学习的图像特征,并使用这些特征来训练图像分类器。特征提取是使用预训练深度网络的表征能力的最简单最快捷的方式。例如,您可以使用 fitcecoc(Statistics and Machine Learning Toolbox™) 基于提取的特征来训练支持向量机 (SVM)。由于特征提取只需要遍历一次数据,因此如果没有 GPU 来加速网络训练,则不妨从特征提取开始。

加载数据

解压缩示例图像并加载这些图像作为图像数据存储。imageDatastore 根据文件夹名称自动标注图像,并将数据存储为 ImageDatastore 对象。通过图像数据存储可以存储大图像数据,包括无法放入内存的数据。将数据拆分,其中 70% 用作训练数据,30% 用作测试数据。

unzip('MerchData.zip');

imds = imageDatastore('MerchData', ...
    'IncludeSubfolders',true, ...
    'LabelSource','foldernames');

[imdsTrain,imdsTest] = splitEachLabel(imds,0.7,'randomized');

在这个非常小的数据集中,现在有 55 个训练图像和 20 个验证图像。显示一些示例图像。

numImagesTrain = numel(imdsTrain.Labels);
idx = randperm(numImagesTrain,16);

for i = 1:16
    I{i} = readimage(imdsTrain,idx(i));
end

figure
imshow(imtile(I))

加载预训练网络

加载一个预训练的 AlexNet 网络。如果未安装 Deep Learning Toolbox Model for AlexNet Network 支持包,则软件会提供下载链接。AlexNet 已基于超过一百万个图像进行训练,可以将图像分为 1000 个对象类别。例如键盘、鼠标、铅笔和多种动物。因此,该模型已基于大量图像学习了丰富的特征表示。

net = alexnet;

显示网络架构。该网络有五个卷积层和三个全连接层。

net.Layers
ans = 
  25x1 Layer array with layers:

     1   'data'     Image Input                   227x227x3 images with 'zerocenter' normalization
     2   'conv1'    Convolution                   96 11x11x3 convolutions with stride [4  4] and padding [0  0  0  0]
     3   'relu1'    ReLU                          ReLU
     4   'norm1'    Cross Channel Normalization   cross channel normalization with 5 channels per element
     5   'pool1'    Max Pooling                   3x3 max pooling with stride [2  2] and padding [0  0  0  0]
     6   'conv2'    Grouped Convolution           2 groups of 128 5x5x48 convolutions with stride [1  1] and padding [2  2  2  2]
     7   'relu2'    ReLU                          ReLU
     8   'norm2'    Cross Channel Normalization   cross channel normalization with 5 channels per element
     9   'pool2'    Max Pooling                   3x3 max pooling with stride [2  2] and padding [0  0  0  0]
    10   'conv3'    Convolution                   384 3x3x256 convolutions with stride [1  1] and padding [1  1  1  1]
    11   'relu3'    ReLU                          ReLU
    12   'conv4'    Grouped Convolution           2 groups of 192 3x3x192 convolutions with stride [1  1] and padding [1  1  1  1]
    13   'relu4'    ReLU                          ReLU
    14   'conv5'    Grouped Convolution           2 groups of 128 3x3x192 convolutions with stride [1  1] and padding [1  1  1  1]
    15   'relu5'    ReLU                          ReLU
    16   'pool5'    Max Pooling                   3x3 max pooling with stride [2  2] and padding [0  0  0  0]
    17   'fc6'      Fully Connected               4096 fully connected layer
    18   'relu6'    ReLU                          ReLU
    19   'drop6'    Dropout                       50% dropout
    20   'fc7'      Fully Connected               4096 fully connected layer
    21   'relu7'    ReLU                          ReLU
    22   'drop7'    Dropout                       50% dropout
    23   'fc8'      Fully Connected               1000 fully connected layer
    24   'prob'     Softmax                       softmax
    25   'output'   Classification Output         crossentropyex with 'tench' and 999 other classes

第一层(图像输入层)需要大小为 227×227×3 的输入图像,其中 3 是颜色通道数。

inputSize = net.Layers(1).InputSize
inputSize = 1×3

   227   227     3

提取图像特征

网络构造输入图像的分层表示。更深层包含更高级别的特征,这些特征使用较浅层的较低级别特征构建。要获得训练图像和测试图像的特征表示,请在全连接层 'fc7' 上使用 activations。要获得图像的较低级别表示,请使用网络中较浅的层。

网络要求输入图像的大小为 227×227×3,但图像数据存储中的图像具有不同大小。要在将训练图像和测试图像输入到网络之前自动调整它们的大小,请创建增强的图像数据存储,指定所需的图像大小,并将这些数据存储用作 activations 的输入参数。

augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain);
augimdsTest = augmentedImageDatastore(inputSize(1:2),imdsTest);

layer = 'fc7';
featuresTrain = activations(net,augimdsTrain,layer,'OutputAs','rows');
featuresTest = activations(net,augimdsTest,layer,'OutputAs','rows');

从训练数据和测试数据中提取类标签。

YTrain = imdsTrain.Labels;
YTest = imdsTest.Labels;

拟合图像分类器

使用从训练图像中提取的特征作为预测变量,并使用 fitcecoc (Statistics and Machine Learning Toolbox) 拟合多类支持向量机 (SVM)。

mdl = fitcecoc(featuresTrain,YTrain);

对测试图像进行分类

使用经过训练的 SVM 模型和从测试图像中提取的特征对测试图像进行分类。

YPred = predict(mdl,featuresTest);

显示四个示例测试图像及预测的标签。

idx = [1 5 10 15];
figure
for i = 1:numel(idx)
    subplot(2,2,i)
    I = readimage(imdsTest,idx(i));
    label = YPred(idx(i));
    
    imshow(I)
    title(label)
end

计算针对测试集的分类准确度。准确度是网络预测正确的标签的比例。

accuracy = mean(YPred == YTest)
accuracy = 1

此 SVM 有很高的准确度。如果使用特征提取时的准确度不够高,则尝试迁移学习。

输出参数

全部折叠

预训练的 AlexNet 卷积神经网络,以 SeriesNetwork 对象形式返回。

未经训练的 AlexNet 卷积神经网络架构,以 Layer 数组形式返回。

提示

参考

[1] ImageNet. http://www.image-net.org

[2] Russakovsky, O., Deng, J., Su, H., et al. "ImageNet Large Scale Visual Recognition Challenge." International Journal of Computer Vision (IJCV). Vol 115, Issue 3, 2015, pp. 211–252

[3] Krizhevsky, Alex, Ilya Sutskever, and Geoffrey E. Hinton. "ImageNet Classification with Deep Convolutional Neural Networks." Communications of the ACM 60, no. 6 (May 24, 2017): 84–90. https://doi.org/10.1145/3065386

[4] BVLC AlexNet Model. https://github.com/BVLC/caffe/tree/master/models/bvlc_alexnet

扩展功能

版本历史记录

在 R2017a 中推出