美文网首页
Matlab 深度学习工具箱™入门指南(1)

Matlab 深度学习工具箱™入门指南(1)

作者: 彩虹直至黑白_Joon | 来源:发表于2020-03-12 14:23 被阅读0次

    一、深度学习工具箱产品说明
    1)创建,分析和训练深度学习网络
    深度学习工具箱(以前称为Neural Network Toolbox™)为使用算法,预训练模型和应用程序设计和实现深度神经网络提供了框架。 您可以使用卷积神经网络(ConvNet,CNN)和长期短期记忆(LSTM)网络对图像,时间序列和文本数据执行分类和回归。 您可以使用自定义训练循环,共享权重和自动区分功能来构建高级网络架构,例如生成对抗网络(GAN)和暹罗(Simese)网络。 应用程序和绘图可帮助您可视化激活,编辑和分析网络体系结构以及监视训练进度。
    您可以通过ONNX™格式与TensorFlow™和PyTorch交换模型,并从TensorFlow-Keras和Caffe导入模型。 该工具箱通过预训练的模型库(包括NASNet,SqueezeNet,Inceptionv3和ResNet-101)支持转移学习。

    您可以加快在单GPU或多GPU工作站上的训练;(使用Parallel Computing Toolbox™),或者扩展到包括NVIDIA GPU Cloud DGX系统和AmazonEC2®GPU实例在内的集群和云(使用MATLAB®Parallel Server™) 。
    2)深度网络设计器入门
    此示例显示了如何微调经过预训练的GoogLeNet网络,以对新的图像集合进行分类。 此过程称为转移学习,通常比训练新网络更快,更容易,因为您可以使用较少数量的培训图像将学习到的功能应用于新任务。 要以交互方式为传输学习准备网络,请使用Deep Network Designer。
    i. 加载预训练网络
    加载预训练的GoogLeNet网络。 如果需要下载网络,请使用下载链接。

    net= googlenet;
    

    将网络导入Deep Network Designer
    打开深度网络设计器。

    deepNetworkDesigner
    

    单击Import,然后从工作区中选择网络。 Deep Network Designer会显示整个网络的缩小视图。 探索网络图。 要使用鼠标放大,请使用Ctrl +滚轮。


    image.png

    编辑网络以进行转移学习
    要重新训练经过预训练的网络以对新图像进行分类,请使用适合新数据集的新层替换最终层。 您必须更改类数以匹配您的数据。

    将新的fullyConnectedLayer从“Layer Library”拖到画布上。 将OutputSize编辑为新数据中的类数,在本示例中为5。

    编辑学习率,以使新层中的学习速度比转移层中的学习速度更快。 将WeightLearnRateFactor和BiasLearnRateFactor设置为10。删除最后一个完全连接的连接,然后连接新层。


    image.png

    更换输出层。 滚动到“Layer Library”的末尾,然后将新的classificationLayer拖到画布上。 删除原始输出层,然后连接新层。


    image.png

    检查网络
    要确保已编辑的网络已准备好进行培训,请单击Analyze,并确保深度学习网络分析器报告零错误。


    image.png

    导出训练网络
    返回到深度网络设计器,然后单击Export。 深度网络设计器将网络导出到名为lgraph_1的新变量,其中包含已编辑的网络层。 现在,您可以将图层变量提供给trainNetwork函数。 您还可以生成MATLAB®代码,以重新创建网络体系结构,并将其作为layerGraph对象或MATLAB工作区中的Layer数组返回。

    加载数据和训练网络(Load Data and Train Network)

    解压缩并将新图像加载为图像数据存储。 将数据分为70%训练数据和30%验证数据。

    unzip('MerchData.zip');  %解压数据文件
     imds = imageDatastore('MerchData','IncludeSubfolders',true,'LabelSource','foldernames'); 
     [imdsTrain,imdsValidation] = splitEachLabel(imds,0.7,'randomized'); %划分数据集,7:3
    

    调整图像大小以匹配预先训练的网络输入大小。

    augimdsTrain = augmentedImageDatastore([224 224],imdsTrain);
     augimdsValidation = augmentedImageDatastore([224 224],imdsValidation);
    

    指定训练选项。
    •指定最小批量大小,即每次迭代中使用多少个图像。
    •指定少量的时期。 时期是整个训练数据集的完整训练周期。 对于转学,您不需要培训很多时间。
    在每个时期都对数据进行洗牌。
    •将InitialLearnRate设置为一个较小的值,以减慢传输层中的学习速度。
    •指定验证数据和较小的验证频率。
    •在训练过程中打开训练图以监视进度。

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

    要训​​练网络,请将从应用程序lgraph_1导出的图层,训练图像和选项提供给trainNetwork函数。 默认情况下,trainNetwork使用GPU(如果有)(需要Parallel Computing Toolbox™)。 否则,它将使用CPU。训练很快,因为数据集很小。

    netTransfer = trainNetwork(augimdsTrain,lgraph_1,options);
    
    image.png

    测试训练好的的网络
    使用微调网络对验证图像进行分类,然后计算分类精度。

    [YPred,probs] = classify(netTransfer,augimdsValidation); 
    accuracy = mean(YPred == imdsValidation.Labels)
    

    accuracy = 1
    显示四个带有预测标签和预测概率的样本验证图像。

    idx = randperm(numel(augimdsValidation.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) + ", " + num2str(100*max(probs(idx(i),:)),3) + "%");
     end
    
    image.png

    要了解更多信息并尝试其他经过预训练的网络,请参阅Deep Network Designer。

    1. 在10行MATLAB代码中尝试深度学习
      本示例说明了如何使用深度学习仅使用10行MATLAB代码来识别实时网络摄像头上的对象。 尝试该示例,了解开始使用MATLAB进行深度学习有多么简单。
      1 运行这些命令以获取所需的下载内容,连接到网络摄像头,并获取预训练的神经网络。
    camera = webcam; % Connect to the camera 
    net = alexnet; % Load the neural network
    

    如果您需要安装网络摄像头和alexnet附加组件,则会显示来自每个功能的消息,并带有一个链接,以帮助您使用“附加组件资源管理器”下载免费的附加组件。 或者,请参阅AlexNet网络的深度学习工具箱模型和USB网络摄像头的MATLAB支持包。

    安装用于AlexNet网络的深度学习工具箱模型后,可以使用它对图像进行分类。 AlexNet是一种预先训练的卷积神经网络(CNN),已经在超过一百万张图像上进行了训练,并且可以将图像分类为1000个对象类别(例如,键盘,鼠标,咖啡杯,铅笔和许多动物)。

    运行以下代码以显示和分类实时图像。 将网络摄像头指向一个对象,然后神经网络报告其认为该网络摄像头正在显示的对象类别。 它将一直对图像进行分类,直到您按Ctrl + C。 该代码使用imresize调整网络图像的大小。

    while true im = snapshot(camera); % Take a picture
       image(im); % Show the picture 
       im = imresize(im,[227 227]); % Resize the picture for alexnet 
       label = classify(net,im); % Classify the picture 
      title(char(label)); % Show the class label 
      drawnow 
    end
    

    在此示例中,网络将咖啡杯正确分类。 对周围物体进行实验,以查看网络的准确性。


    image.png

    要观看此示例的视频,请参见《 MATLAB代码的11行》中的“深度学习”。
    要了解如何扩展此示例并显示类别的概率分数,请参阅“使用深度学习对网络摄像头图像进行分类”。
    对于深度学习的下一步,您可以将经过预训练的网络用于其他任务。
    通过转移学习或特征提取解决图像数据上的新分类问题。 有关示例,请参阅“使用迁移学习更快地开始深度学习”和“使用从预训练网络中提取的特征训练分类器”。 要尝试其他预训练的网络,请参阅“预训练的深度神经网络”。

    1. 使用预训练网络对图像进行分类
      这个例子展示了如何使用预训练的深度卷积神经网络GoogLeNet对图像进行分类。

      GoogLeNet已经接受了超过一百万张图像的培训,可以将图像分类为1000个对象类别(例如键盘,咖啡杯,铅笔和许多动物)。 该网络已经为各种图像学习了丰富的功能表示。 网络将图像作为输入,然后输出图像中对象的标签以及每个对象类别的概率。

    加载预训练网络
    加载预训练的GoogLeNet网络。 您也可以选择加载其他预训练网络以进行图像分类。 此步骤需要适用于GoogLeNet网络的Deep Learning Toolbox™模型支持包。 如果您没有安装必需的支持包,则该软件将提供下载链接。

    net=googlenet;
    

    读取图像并调整其大小

    您要分类的图像的大小必须与网络的输入大小相同。 对于GoogLeNet,网络输入大小是图像输入层的InputSize属性。

    读取要分类的图像,然后将其调整为网络的输入大小。
    调整大小会稍微改变图像的纵横比。

    I = imread("peppers.png");
    inputSize = net.Layers(1).InputSize; 
    I = imresize(I,inputSize(1:2));
    

    分类并显示图像
    用预测的标签分类并显示图像。

    label = classify(net,I);
    figure
    imshow(I)
    title(string(label))
    
    image.png

    有关更详细的示例,该示例还显示了如何同时显示最高预测及其相关概率,请参阅“使用GoogLeNet对图像进行分类”。

    对于深度学习的下一步,您可以将经过预训练的网络用于其他任务。 通过转移学习或特征提取解决图像数据上的新分类问题。 有关示例,请参阅“使用迁移学习更快地开始深度学习”和“使用从预训练网络中提取的特征训练分类器”。 要尝试其他预训练的网络,请参阅“预训练的深度神经网络”。
    参考:

    1. Szegedy, Christian, Wei Liu, Yangqing Jia, Pierre Sermanet, Scott Reed, Dragomir Anguelov, Dumitru Erhan, Vincent Vanhoucke, and Andrew Rabinovich. "Going deeper with convolutions." In Proceedings of the IEEE conference on computer vision and pattern recognition, pp. 1-9. 2015.
    2. BVLC GoogLeNet Model. https://github.com/BVLC/caffe/tree/master/models/bvlc_googlenet

    二、迁移学习入门
    此示例显示了如何使用转移学习来重新训练ResNet-18(一种预训练的卷积神经网络)以对一组新图像进行分类。 尝试以下示例,了解开始使用MATLAB®进行深度学习有多么简单。

    转移学习通常用于深度学习应用程序。 您可以采用经过预训练的网络,并将其用作学习新任务的起点。 与使用从头开始随机初始化权重的网络进行训练相比,通过迁移学习对网络进行调整通常会更快,更轻松。 您可以使用少量的训练图像将学习到的功能快速转移到新任务中。


    image.png

    Load Data
    解压缩并将新图像加载为图像数据存储。 将数据分为训练和验证数据集。 使用70%的图像进行训练,并使用30%的图像进行验证。

    unzip('MerchData.zip');
     imds = imageDatastore('MerchData','IncludeSubfolders',true,'LabelSource','foldernames'); [imdsTrain,imdsValidation] = splitEachLabel(imds,0.7,'randomized');
    

    加载预训练网络
    加载预训练的ResNet-18网络。 如果未安装用于ResNet-18网络的Deep Learning Toolbox™模型,则该软件将提供下载链接。 ResNet-18已经接受了超过一百万张图像的培训,可以将图像分类为1000个对象类别(例如键盘,咖啡杯,铅笔和许多动物)。 该网络已经为各种图像学习了丰富的功能表示。 网络将图像作为输入,输出图像中对象的标签以及每个对象类别的概率。 要使用不同的预训练网络执行转移学习,请参阅“训练深度学习网络对新图像进行分类”。

    net=resnet18;
    

    替换最终层
    要重新训练ResNet-18以对新图像进行分类,请替换网络的最后一个完全连接的层和最后一个分类层。 在ResNet-18中,这些层分别具有名称'fc1000'和'ClassificationLayer_predictions'。 将新的完全连接层设置为与新数据集中的类数相同的大小(在此示例中为5)。 要在新层中学习比在传输层中学习更快,请增加完全连接层的学习率因子。

    numClasses = numel(categories(imdsTrain.Labels)); 
    lgraph = layerGraph(net); 
    newFCLayer = fullyConnectedLayer(numClasses,'Name','new_fc','WeightLearnRateFactor',10,');
    lgraph = replaceLayer(lgraph,'fc1000',newFCLayer);
     newClassLayer = classificationLayer('Name','new_classoutput'); 
    lgraph = replaceLayer(lgraph,'ClassificationLayer_predictions',newClassLayer);
    

    训练网络

    网络需要大小为224 x 224 x 3的输入图像,但是图像数据存储区中的图像具有不同的大小。 使用增强图像数据存储区来自动调整训练图像的大小。 您还可以使用imageDataAugmenter来指定要在训练图像上执行的其他增强操作,以帮助防止网络过度拟合。

    inputSize = net.Layers(1).InputSize; 
    augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain); augimdsValidation = augmentedImageDatastore(inputSize(1:2),imdsValidation);
    

    指定训练选项,包括小批量大小和验证数据。 将InitialLearnRate设置为一个较小的值可以减慢所传输层中的学习速度。 在上一步中,您增加了全连接层的学习速率因子,以加快新的最终层的学习速度。 学习速率设置的这种组合导致仅在新层中进行快速学习,而在其他层中进行较慢的学习。

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

    使用训练数据训练网络。 默认情况下,trainNetwork使用GPU(如果有)(需要Parallel Computing Toolbox™和具有CUDA®功能且计算能力为3.0或更高的GPU)。 否则,它将使用CPU。

    trainedNet = trainNetwork(augimdsTrain,lgraph,options);
    
    image.png

    分类验证图像
    使用微调网络对验证图像进行分类,然后计算分类精度。

    YPred = classify(trainedNet,augimdsValidation); 
    accuracy = mean(YPred == imdsValidation.Labels)
    

    accuracy = 1

    学到更多
    要使用不同的预训练网络执行转移学习,请参阅“训练深度学习网络对新图像进行分类”。 要尝试使用Deep Network Designer应用程序进行转移学习,请参阅“使用Deep Network Designer进行转移学习”。 有关预训练网络的列表和比较,请参阅“预训练深度神经网络”。

    参考文献

    [1] Krizhevsky, Alex, Ilya Sutskever, and Geoffrey E. Hinton. "ImageNet Classification with Deep Convolutional Neural Networks." Advances in neural information processing systems. 2012.

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

    三、创建简单的图像分类网络

    该示例显示了如何创建和训练用于深度学习分类的简单卷积神经网络。 卷积神经网络是深度学习必不可少的工具,特别适合于图像识别。
    该示例演示如何:
    •加载图像数据。
    •定义网络体系结构。
    •指定训练选项。
    •训练网络。
    •预测新数据的标签并计算分类准确性。
    i)载入数据
    将数字样本数据加载为图像数据存储。 imageDatastore函数根据文件夹名称自动标记图像。

    digitDatasetPath = fullfile(matlabroot,'toolbox','nnet','nndemos', ...
    'nndatasets','DigitDataset'); 
    
    
    imds = imageDatastore(digitDatasetPath, ...
    'IncludeSubfolders',true, ...
    'LabelSource','foldernames');
    

    将数据分为训练和验证数据集,以便训练集中的每个类别包含750张图像,而验证集包含每个标签中的其余图像。 splitEachLabel将图像数据存储区分为两个新的数据存储区,以进行训练和验证。

    numTrainFiles = 750; 
    
    [imdsTrain,imdsValidation] = splitEachLabel(imds,numTrainFiles,'randomize');
    

    ii) 定义网络架构

    定义卷积神经网络架构。 在网络输入层中指定图像的大小,并在分类层之前指定完全连接层中的类数。 每个图像为28 x 28 x 1像素,共有10个类别。

    inputSize = [28 28 1]; 
    numClasses = 10; 
    layers = [ imageInputLayer(inputSize) convolution2dLayer(5,20) batchNormalizationLayer reluLayer fullyConnectedLayer(numClasses)
     softmaxLayer classificationLayer];
    

    有关深度学习层的更多信息,请参见“深度学习层列表”。

    iii)训练网络
    指定训练选项并训练网络。
    默认情况下,trainNetwork使用GPU(如果有)(需要Parallel Computing Toolbox™和具有CUDA®功能且计算能力为3.0或更高的GPU)。 否则,它将使用CPU。 您也可以使用trainingOptions的“ ExecutionEnvironment”名称/值对参数指定执行环境。

    options = trainingOptions('sgdm', ...
    'MaxEpochs',4, ...
    'ValidationData',imdsValidation, ...
    'ValidationFrequency',30, ...
    'Verbose',false, ...
    'Plots','training-progress'); 
    
    net = trainNetwork(imdsTrain,layers,options); 
    ![image.png](https://img.haomeiwen.com/i14045085/ff0c55fa76589a8d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    有关训练选项的更多信息,请参见“设置参数和训练卷积神经网络”。
    iv) 测试网络
    对验证数据进行分类并计算分类准确性。
    

    YPred = classify(net,imdsValidation); YValidation = imdsValidation.Labels; accuracy = mean(YPred == YValidation)

    accuracy=0.9892
    对于深度学习的下一步,您可以尝试将经过预训练的网络用于其他任务。 通过转移学习或特征提取解决图像数据上的新分类问题。 有关示例,请参阅“使用迁移学习更快地开始深度习”和“使用从预训练网络中提取的特征训练分类器”。 要了解有关预训练网络的更多信息,请参见“预训练深度神经网络”。

    相关文章

      网友评论

          本文标题:Matlab 深度学习工具箱™入门指南(1)

          本文链接:https://www.haomeiwen.com/subject/dsqujhtx.html