什么是深度学习


深度学习是一种使用深度神经网络的机器学习技术。它使用多层网络来进行预测。深度学习开始火热是源于它在图片识别上的高准确性。

如果使用传统的机器学习方法去识别手写数字,首先需要找出一些度量标准或图像特征用来区分每个数字。针对于我的图像集计算这些特征,然后使用这些特征来训练分类器。

之后,当你要使用这个训练好的分类器对新的图像进行分类时,首先需要计算图像的特征,然后将这些特种传递给分类器。

深度学习的目标是进行端到端的学习,图像本身就是输入,省去了特征寻找的步骤,由深度神经网络自行在图像中学习。

使用预训练网络

将图像导入MATLAB中

在本节课程中,您将学习如何使用预先构建的深度神经网络对下面 12 个图像的内容进行分类。理想的分类应为 ‘beach’、‘cat’、‘cupcakes’、‘lake’、‘fish’ 等。

在此交互练习中,您会将其中部分图像文件导入到 MATLAB 中并查看它们。

可以使用 imread 函数来导入大多数标准文件格式(GIF、JPEG、PNG 等)的图像。
使用 imshow 函数来显示存储在 MATLAB 变量中的图像。

img1 = imread('file01.jpg')
imshow(img1)img2 = imread('file02.jpg');
imshow(img2)img3 = imread('file03.jpg');
imshow(img3)

执行预测

下面的程序将使用AlexNet网络,该网络是由一个深度学习研究团队,在2012年设计和训练的。

他们使用1000个类别中的100万个图像,对AlexNet进行了为期一周的训练。下面将学习如何把AlexNet加载到MATLAB中。然后使用AlexNet对图像进行分类。

可以使用 alexnet 函数在 MATLAB 工作区中创建预定义的深度网络“AlexNet”的副本。使用 classify 函数对图像进行预测。

deepnet = alexnet
img1 = imread('file01.jpg');
imshow(img1)pred1 = classify(deepnet,img1)

通过附加功能管理器来安装预训练网络的支持包。

CNN架构

CNN中的层

预训练网络AlexNet是一个卷积神经网络(Convolutional Neural Network, CNN)。CNN是一种常用的神经网络,它适用于其输入本身具有二维结构(如图像)的应用。

像所有神经网络一样,CNN由多个层组成,信息在这些层之间传递。

对于分类问题,输出层会返回网络对每个可能的类的预测强度。CNN包含由丰富多样的层,但一般来说,其中大部分的层是将输入图像转换维一组特征,最后几层用于执行分类。

网络是如何做到这一点的呢?

网络的架构,即层的类型、大小、顺序,由架构师选择。这些层本身有许多参数称为权重,权重决定数据在通过层时,各层的行为。这些权重的值是基于已知数据对网络进行训练来确定的。通过这种方式,网络可以从这些数据中学习到其行为。两个网络可以有相同的架构,但如果使用不同数据集进行训练,这两个网络的行为会有所不同。

查看网络层

像任何 CNN 一样,AlexNet 在 MATLAB 中表示为一个层数组。需要特别关注此数组的第一个和最后一个元素,它们分别代表输入层和输出层。

下面练习中,您将查看这些层的属性,以确定 AlexNet 接受什么形式的图像作为输入,以及它可以返回哪些类作为输出。

deepnet = alexnet;
ly = deepnet.Layers% 变量 ly 是由网络层构成的数组
% 通过使用常规的 MATLAB 数组索引对 ly 进行索引来查看单个层
inlayer = ly(1)

% 网络的每个层都有与其类型相关的属性
% 输入层的一个重要属性是 InputSize,它是网络要求的输入图像大小(维度)
insz = inlayer.InputSize


灰度图像在 MATLAB 中表示为 m×n 数组,每个元素的值代表对应图像像素的强度。彩色图像表示为 m×n×3 数组,三个 m×n 平面分别表示红色、绿色和蓝色强度。

% 输出层的 Classes 属性给出了训练的网络可预测的类别名称。
outlayer = ly(end)
categorynames = outlayer.Classes


您已将预训练的 AlexNet 网络加载到 MATLAB 中,并查看了它的结构。它可以基于 1000 个可能的类别来预测一个 227×227 彩色图像内容的分类。

研究预测

classify 函数返回输入图像的预测类,但是,有没有办法知道网络对该分类有多少“信心”呢?在决定如何处理输出时,置信度是一个重要的考虑事项。

为了将输入归入 n 个类之一,神经网络具有一个包含 n 个神经元的输出层,每个类对应一个神经元。网络接受输入后,会为每个神经元计算一个数值。这些数值代表网络对输入可能属于每个类的概率所做的预测。

查看这些值可以让您深入了解网络的预测。

查看预测

img = imread('file01.jpg');
imshow(img)
net = alexnet;
categorynames = net.Layers(end).ClassNames;[pred,scores] = classify(net,img);
bar(scores) % 使用条形图查看

此条形图显示1000个类,但多数非常接近0,我们只需关注有意义的类即可。

highscores = scores > 0.01;
bar(scores(highscores))
xticklabels(categorynames(highscores))

% 还可以使用更为动态的条件
% 采用比中位分数高一个标准差的阈值。
thresh = median(scores) + std(scores);
highscores = scores > thresh;xticks(1:length(scores(highscores)))
xticklabels(categorynames(highscores))
xtickangle(60)  % 调整x轴标签的角度,使得显示完全

管理图像数据集合

使用datastore存储图像数据

当需要处理的数据量变大时就不适合将所有数据读入内存中。datastore是一种matlab变量。它可以以用数据源,如图像文件的文件夹。在创建数据存储时matlab会遍历相关文件并存储一些基本元信息,如文件的名称和格式,但不导入数据,可以在需要使用时,随时用datastore来导入数据。可以是单个文件,也可以是整个数据集。

MATLAB中CNN能够使用datastore,而不是逐个提供文件。

ls *.jpg % 列出文件目录
net = alexnet;% 使用imageDatastore函数创建一个datastore
imds = imageDatastore('file*.jpg')% datastore的属性包含有关数据文件的元信息
fname = imds.Files


您可以使用 read、readimage 和 readall 函数从数据存储手动导入数据:read 按顺序一次导入一个图像;readimage 导入单个特定图像;readall 将所有图像导入一个元胞数组中(每个图像位于一个单独元胞中)。

img = readimage(imds,7);
% 在CNN函数中使用datastore变量作为输入
preds = classify(net,imds)

预处理输入图像

Image Processing Toolbox提供了几个matlab app,帮助我轻松检查和处理图像。

调整输入图像

img = imread('file01.jpg');
imshow(img)
% 使用size函数查看图像的大小
sz = size(img)
% 查看网络输入层要求的图像大小
net = alexnet;
inlayer = net.Layers(1)
insz = inlayer.InputSize
% 使用 imresize  函数调整图像大小,使其与预期的输入大小相匹配。
img = imresize(img,[227 227]);
imshow(img)

预处理datastore中的图像

图像预处理工作流


创建augmentedImageDataStore

augmentedImageDatastore 函数可以对整个集合的图像执行简单的预处理。

ls *.jpg
net = alexnetimds = imageDatastore('file*.jpg')
% 调整大小是对图像分类时最常见的预处理步骤之一。
auds = augmentedImageDatastore([227 227],imds)
preds = classify(net,auds)

ls *.jpg
net = alexnet;
imds = imageDatastore(file*.jpg);montage(imds) % 使用montage函数来显示所有的图像
% 使用augmentedImageDatastore函数将灰度图片转换为三维图像,就可以用来分类了
auds = augmentedImageDatastore([227 227],imds,'ColorPreprocessing','gray2rgb');
preds = classify(net,auds)

用子文件夹选项创建datastore

在图像分类应用中,您的图像通常按类组织到不同文件夹中。在此交互练习中,您将创建一个数据存储,它引用 Flowers 文件夹,该文件夹包含 5 个子文件夹,其中每个子文件夹包含一种花卉的 3 个图像。

net = alexnet;
% 使用'IncludeSubfolders'选项在给定文件夹的子文件夹中查找图像
flwrds = imageDatastore('Flowers','IncludeSubfolders',true);
preds = classify(net,flwrds)

执行迁移学习

什么是迁移学习

如果你想实现识别鲜花种类的工作,alexnet网络的1000中分类中并没有各种的鲜花。但是你可以将这个网络做一定的修改来实现你的功能。

迁移学习的必备要素

需要三个要素。1. 需要一个网络来进行训练。先从一个预训练网络开始,然后对其进行修改。2. 需要有用来进行训练的数据。即需要已带正确标签的示例图像。3. 需要指定一组训练选项,训练时要应用一种算法,以迭代方式提高网络正确识别训练图像的能力。该算法可以使用许多参数进行微调,例如每个步骤使用多少个训练图像,最大的迭代次数,以及学习率,即新的迭代更新网络参数的幅度大小。

准备训练数据

标注图像

在训练网络时,您需要为训练图像提供已知标签。Flowers 文件夹包含 12 个子文件夹,每个子文件夹包含一种花卉的 80 个图像。因此,文件夹的名称可用于提供训练所需的标签。

load pathToImages
% 训练所需要的Labels属性是可以存储在DataStore中的,但默认情况下为空
% 需要指定LabelSource选项,根据文件夹名称自动确定标签
flwrds = imageDatastore(pathToImages,'IncludeSubfolders',true,'LabelSource','foldernames')
flowernames = flwrds.Labels

拆分训练数据和测试数据

% 使用splitEachLabel函数,可以将DataStore中的图像分成两部分。
% 一个用于训练,一个用于测试。
[flwrTrain,flwrTest] = splitEachLabel(flwrds,0.6)
% 还可使用randomized来实现随即乱序。
[flwrTrain,flwrTest] = splitEachLabel(flwrds,0.8,'randomized')

% 当splitEachLabel函数的第二个参数不是0-1之间的值时,就不再是按比例划分了
% 他指定每个标签对应的文件中要分配给ds1的确切数量
[flwrTrain,flwrTest] = splitEachLabel(flwrds,50)

将图像分成两组,可以方便的使用一组来训练网络,另一组来测试性能。还可以分成三组,多加一组验证集,用于训练期间的验证。

创建augmentedImageDataStore对图像做预处理

可做的预处理包括旋转、翻转、平移、剪切、放缩。

修改网络层(CNN网络)

查看AlexNet这样的预训练网络的层时,发现大部分都是卷积层、池化层、修正线性单元层。
它们接收原始的输入图像,并提取各种特征,然后将特征用于分类。

注意,第23层是一个全连接层,其中包含1000个神经元。该层接收前面提取的特征,并将它们映射到1000个输出类。

然后下一层,softmax层,将这1000个类的原始值,转换为归一化分数。大致来说,每个分数值就是,网络预测某图像可能属于该类的概率。

最后一层获取这些概率,并返回最可能的类座位网络的输出。再执行迁移学习时,通常只需要更改最后这几层,以便适应于具体的问题。

因此在开始时,你的网络域预训练网络的特征提取行为相同。只是还没有执行特征映射到图像类的训练。

当使用新数据进行训练时,网络会学习建立该映射,并对特征提取进行优化。使其更适合你的具体应用。

anet = alexnet;
layers = anet.Layers   % alexnet网络的层
% 使用fullyConnectedLayer函数使用给定数量的神经元创建一个新的全连接层
% 使用12个神经元,针对12种花
fc = fullyConnectedLayer(12)
% 替换掉层数组layers中的全连接层
layers(23) = fc

当前,输出层仍然使用 AlexNet 网络的 1000 个类标签。当信息从您刚创建的新(12 类)全连接层传递到该层时,会出现问题。要解决此问题,您需要用新的空白输出层替换输出层。网络会在训练期间根据训练数据标签来确定这 12 个类。

layers(end) = classificationLayer

设置训练选项

可以使用trainingOptions 函数来查看训练算法的可用选项。

% 创建一个包含SGDM优化器的 默认训练算法的 变量opts
opts = trainingOptions('sgdm')

也可以使用其他的训练算法,比如创建包含Adam优化器的训练选项的变量。

更改学习率

通常,您首先会尝试使用大多数选项的默认值来进行训练。但是,在执行迁移学习时,您通常希望将 InitialLearnRate 设置为一个比其默认值 0.01 小的值。

学习率控制算法更改网络权重的幅度。迁移学习的目标是微调现有网络,因此与从头开始训练相比,您通常希望更改权重的幅度不大。

opts = trainingOptions('sgdm','InitialLearnRate',0.001)

训练网络

执行训练

要执行迁移学习,需要具备三个要素。1. 需要一个表示网络的层数组。2. 需要为训练图像创建一个datastore,用Labels属性存储这些训练图像的正确标签。3. 需要一个变量来存放你的训练算法设置。

然后就只需要将这三项传递给trainNetwork函数,并运行该函数即可。

完成后,您将得到一个层数组输出,就是经过训练的新网络。它与输入网络一样,只是权重进行了更新。默认情况下,你将看到显示训练进度的文本。

准确度时网络分类正确的训练图像所占的百分比。

你想看到的是准确度在训练过程中不断增长,但准确度其实并不能衡量网络对每个预测的可信度。损失值是另一个指标,用来衡量网络在对整个训练图像集进行预测时与完美预测的差距。随着训练的进行,损失值应该逐渐降低到0。

什么是“mini-batch”

在每次迭代中,网络都会使用训练图像的一个子集来更新权重,这个子集就称为Mini-batch。每次迭代都使用不同的mini-batch。如果整个训练集都被使用过了,则称完成了一轮(epoch)。

可以在训练算法选项中设置最大轮数(MaxEpochs)和小批量的大小(MiniBatchSize)。

训练期间报告的准确度和损失针对的是当前迭代中使用的mini-batch数据。

默认情况下,图像在分成mini-batch之前会进行一次乱序处理。可以使用Shuffle选项来控制此行为。

项目训练

项目所需的数据已经上传到CSDN资源中。

% 获取训练图像
flower_ds = imageDatastore('Flowers','IncludeSubfolders',true,'LabelSource','foldernames');
[trainImgs,testImgs] = splitEachLabel(flower_ds,0.6);
numClasses = numel(categories(flower_ds.Labels));% 通过修改 AlexNet 创建网络
net = alexnet;
layers = net.Layers;
layers(end-2) = fullyConnectedLayer(numClasses);
layers(end) = classificationLayer;% 设置训练算法选项
options = trainingOptions('sgdm','InitialLearnRate', 0.001);% 执行训练
[flowernet,info] = trainNetwork(trainImgs, layers, options);% 使用经过训练的网络对测试图像进行分类
testpreds = classify(flowernet,testImgs);

评估性能

评估训练和测试性能

我有一个经Alexnet迁移学习得到得网络flowernet,现在我要对这个迁移学习得到的网络做性能的评估。

% flowernet是要评估性能得网络,info中包含训练的过程信息
load flowernet info% 绘制这个网络的loss曲线,慢慢趋向于0,还不错。
plot(info.TrainingLoss)

load pathToImages    % 数据的存储路径
% 然后我找来新的测试数据,看一下这个网络对测试数据的分类结果
dsflowers = imageDatastore(pathToImages,'IncludeSubfolders',true,'LabelSource','foldernames');
[trainImgs,testImgs] = splitEachLabel(dsflowers,0.98);
flwrPreds = classify(flowernet,testImgs)% 将测试数据的真实标签存在flwrActual中
flwrActual = testImgs.Labels;% 计算分类正确率
numCorrect = nnz(flwrPreds == flwrActual)
fracCorrect = numCorrect/numel(flwrPreds)

除了损失和准确度这种宏观的网络性能度量。还可以进一步研究网络对于不同类图像的性能表现,进而发掘更多信息。

% 使用混淆矩阵来获得更多的网络性能信息
% 可以看到误分类都来自风信子
confusionchart(testImgs.Labels,flwrPreds)

迁移学习函数摘要

看完这篇你就懂了深度学习的具体流程和代码该怎么写了!(Deep Learning Onramp)相关推荐

  1. 级联rc滤波_了解无源RC滤波器,看完这篇你就懂了(二)

    在上一篇文章"了解无源RC滤波器,看完这篇你就懂了(一)"中,我们已经讨论了滤波器修改信号中各种频率分量振幅的方式.然而,除了振幅效应之外,电抗性电路元件总是引入相移. 低通滤波器 ...

  2. c语言游泳是怎么钓鱼的,钓鱼怎么找水层?看完这篇你就懂!

    原标题:钓鱼怎么找水层?看完这篇你就懂! 钓鱼的人经常会听到钓友们时常在谈论着草鱼.鲢鳙怎样找水层这样的问题.下面就给大家说一下鱼儿是怎样找水层的. 一.在什么情况下知道鱼儿们调皮了? 1.气压.水温 ...

  3. 红米k30 android版本,红米K30系列机型众多,傻傻分不清楚?看完这篇你就懂了

    红米K30系列机型众多,傻傻分不清楚?看完这篇你就懂了 2020-10-01 10:51:57 18点赞 33收藏 11评论 红米K30系列 不可否认的是,目前的手机厂商喜欢一次性发布几款新机型,以不 ...

  4. Redis(一)入门:NoSQL OR SQL,看完这篇你就懂了

    目录 前言 一.结构化数据.非结构化数据与半结构化数据 1.结构化数据 2.非结构化数据 3.半结构化数据 二.关系型数据库 SQL 1.什么是关系型数据库? 2.什么是关系模型? 3.以关系型数据库 ...

  5. 深度剖析:Redis分布式锁到底安全吗?看完这篇文章彻底懂了!

    ‍‍‍‍‍‍‍‍‍‍‍‍阅读本文大约需要 20 分钟. 大家好,我是 Kaito. 这篇文章我想和你聊一聊,关于 Redis 分布式锁的「安全性」问题. Redis 分布式锁的话题,很多文章已经写烂了 ...

  6. 深度剖析:Redis 分布式锁到底安全吗?看完这篇文章彻底懂了!

    作者 | Kaito 来源 | 水滴与银弹 阅读本文大约需要 20 分钟. 大家好,我是 Kaito. 这篇文章我想和你聊一聊,关于 Redis 分布式锁的「安全性」问题. Redis 分布式锁的话题 ...

  7. 还不了解什么是商业智能(BI)?看完这篇文章就懂了

    随着新一代信息化.数字化技术和应用的飞速发展,各行各业都开始掀起了新一轮的科技革命和产业革命,这也反过来加快了信息化.数字化在社会各方面的传播速度,扩大了影响力.这种情况下,作为第五大生产要素的数据得 ...

  8. 低通滤波器转带通滤波器公式由来_了解无源RC滤波器,看完这篇你就懂了(一)...

    作为一个电子硬件方面的工作者,怎么能不认识滤波器呢?那么到底什么是滤波?分享一篇科普文了解一下电阻-电容(RC)低通滤波器是什么,以及在何处使用它们能让你更好的掌握高端电路设计实战.本文将介绍滤波的概 ...

  9. CDN到底是个什么鬼?看完这篇你就懂了!

    最近在了解边缘计算,发现我们经常听说的CDN也是边缘计算里的一部分.那么说到CDN,好像只知道它中文叫做内容分发网络.那么具体CDN的原理是什么?能够为用户在浏览网站时带来什么好处呢?解决这两个问题是 ...

  10. CPU架构有多少种?X86与ARM有哪些不同之处?看完这篇你就懂了

    一台服务器.一台电脑.一台手机最重要的电子零部件是什么?没错,就是CPU处理器.它主要负责数据计算.控制功能,是最核心的部分.不过你又知道有多少种CPU架构吗?主流的X86.ARM到底有什么区别? 下 ...

最新文章

  1. VUE的本地应用-V- bind
  2. 我看暴库漏洞原理及规律
  3. 不同虚拟局域网Vlan配置DHCP服务器
  4. [转]jquery的一个模板引擎-zt
  5. 从夫妻吵架中看项目管理
  6. flask框架(三):flask配置文件
  7. spine纹理解包 黑底_“包治百病”是真理,这些小众包真的很治愈系
  8. mysql gis index 索引原理_从原理到优化,深入浅出数据库索引
  9. SELECT COUNT用法
  10. 大数据时代背景下智能工厂的能源管理系统
  11. 维修电工技能实训考核装置
  12. 【C语言】输出100内素数
  13. 夏普打印机SHARP MX-2018UC 发生错误,错误代码:H3-00 解决办法
  14. 深度学习论文: Avoiding Overfitting: A Survey on Regularization Methods for Convolutional Neural Networks
  15. NPOI使用ShiftRows向excel插入行,并复制原有样式
  16. unity制作坦克大战
  17. ATFX:离岸人民币涨破7.2关口,创出2008年以来新高
  18. 跨站脚本执行漏洞详解
  19. JavaScript Set
  20. 让 AI 看懂你的心情,并推荐应景的音乐,以一种简单的实现

热门文章

  1. MPLAB X环境ICD3无法使用
  2. 工业园区与大型制造工厂企业食堂消费管理系统常见需求及解决方案
  3. 程序员常见面试题汇总
  4. oracle asm 加盘,ASM添加磁盘最佳实践
  5. python题库选择题刷题训练_python题库刷题训练开源到了Github
  6. otf字体转ttf 并压缩
  7. python源代码编译后的文件扩展名-python源代码被解释器转换后的格式是什么?
  8. 计算机考研数学英语政治考啥,2016年考研数学一英语一政治计算机考研大纲原文合集.docx...
  9. 飞思卡尔单片机DZ60---TPM1\TPM2溢出中断
  10. 计算机复试不机试的学校,计算机考研复试:计算机考研复试不考机试的高校