基于MATLAB的深度学习——入门篇

概述

  MATLAB从2016年开始就提供深度神经网络的相关工具了,现如今,深度学习的基本使用模块已经相对完善,并且支持逐层拖拽的simulink型的架构设计方式。
  Deep Learning Toolbox™提供了一个用于通过算法、预训练模型和应用程序来设计和实现深度神经网络的框架。您可以使用卷积神经网络(ConvNetCNN)和长短期记忆 (LSTM) 网络对图像、时序和文本数据执行分类和回归。应用程序和绘图可帮助您可视化激活值、编辑网络架构和监控训练进度。
  对于小型训练集,您可以使用预训练深度网络模型(包括 SqueezeNetInception-v3ResNet-101GoogLeNetVGG-19)以及从TensorFlow®-KerasCaffe导入的模型执行迁移学习。
  要加速对大型数据集的训练,您可以将计算和数据分布到桌面计算机上的多核处理器和GPU中(使用Parallel Computing Toolbox™),或者扩展到群集和云,包括Amazon EC2® P2P3G3 GPU 实例(使用 MATLAB® Distributed Computing Server™)。

平台

  Windows 10
  MATLAB 2018a
  Deep Learning Toolbox
  Computer Vision Toolbox

注:如果没有Deep Learning ToolboxComputer Vision Toolbox,需要自己安装,在MATLAB主页的APP中,点击获取更多App,在打开的附加功能资源管理器中,搜索这2个工具箱并下载安装即可。
app
附加功能

一个简单的例子

  在MATLAB官方文档中,提供了一些简单的入门实例。下面我们挑选第一个案例进行简单的分析。

使用 GoogLeNet 对图像进行分类

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

加载预训练网络

1
net = googlenet

  加载一个已知网络十分简单,直接令变量名等于网络名即可(第一次加载可能需要联网下载)。下面我们使用disp(net)简单看一个googlenet的内容:
net
  每个net都有2个属性,即Layers(网络层)和Connections(层连接),Layers为数组,指的是网络图层,指定为Layer阵列。Connections是表,图层连接,指定为具有两列的表。每个表行表示图层图中的连接。第一列Source指定每个连接的源。第二列Destination指定每个连接的目标。连接源和目标要么是图层名称,要么layerName/IOName的窗体,其中IOName是图层输入或输出的名称。
  我们可以继续disp(net.Layers)查看其网络结构:
layers
  可以看出,googlenet一共有144层,第一列为网络名称,第二列为网络的类型,第三列为网络的具体参数。
  这里我们需要网络结构里面的第一个和最后一个参数,即图像输入和分类类别,先定义2个变量保存该信息。

1
2
inputSize = net.Layers(1).InputSize;
classNames = net.Layers(end).ClassNames;

  我们可以简单看下这2个参数里面的信息:
InputSize

读取图像并调整图像大小

  有了训练好的网络结构后,我们就可以用图片进行分类预测了。
  首先读取一张图片,这里使用了官方文档里面的图片,然后要将其调整到网络需要的输入图片大小(否则会编译报错)。

1
2
I = imread('peppers.png');
I = imresize(I,inputSize(1:2));

  使用imresize将图像大小调整为网络的输入大小。调整大小会略微更改图像的纵横比。当然也可以使用更好的调整大小的函数。
  B = imresize(A, [numrows numcols])numrowsnumcols分别指定目标图像的高度和宽度。这里的numrowsnumcols就是刚才inputSize的第1列和第2列数组,即224,224

对图像进行分类

  使用classify对图像进行分类并计算类概率。用于分类的网络训练为针对每个输入图像输出单个标签,即使图像包含多个对象时也是如此。最后我们也可以显示图像及预测的标签,以及具有该标签的图像的预测概率。

1
2
3
4
[label,scores] = classify(net,I);
figure
imshow(I)
title(string(label) + ", " + num2str(100*scores(classNames == label),3) + "%");

  classify():使用经过训练的深度学习神经网络对数据进行分类,一共有3种形式:
classify
  其返回值label就是scores中数组最高的那个对应的labelscores是一个1000*1的向量(因为googlenet一共有1000个分类类别),里面依次存放着每个列别的置信度。scores(classNames == label)即表示找到label对应的那个scores。 其结果如图所示:
结果

显示排名靠前的预测值

  根据scores的特点,我们还可以显示出排名前五的预测标签,并以直方图形式显示它们的相关概率。由于网络将图像分类为如此多的对象类别,并且许多类别是相似的,因此在评估网络时通常会考虑准确度排名前五的几个类别。网络以高概率将图像分类为甜椒。

1
2
3
4
5
6
7
8
9
10
11
[~,idx] = sort(scores,'descend');  % 降序排列
idx = idx(5:-1:1);
classNamesTop = net.Layers(end).ClassNames(idx); % 获取前5个类别
scoresTop = scores(idx);

figure
barh(scoresTop) %绘制水平条形图
xlim([0 1])
title('Top 5 Predictions')
xlabel('Probability')
yticklabels(classNamesTop)

  其结果如下:
前5

标注自己的数据集

谢谢老板!
-------------本文结束感谢您的阅读给个五星好评吧~~-------------