概述
MATLAB
从2016年开始就提供深度神经网络的相关工具了,现如今,深度学习的基本使用模块已经相对完善,并且支持逐层拖拽的simulink
型的架构设计方式。
Deep Learning Toolbox™
提供了一个用于通过算法、预训练模型和应用程序来设计和实现深度神经网络的框架。您可以使用卷积神经网络(ConvNet
、CNN)
和长短期记忆 (LSTM)
网络对图像、时序和文本数据执行分类和回归。应用程序和绘图可帮助您可视化激活值、编辑网络架构和监控训练进度。
对于小型训练集,您可以使用预训练深度网络模型(包括 SqueezeNet
、Inception-v3
、ResNet-101
、GoogLeNet
和VGG-19
)以及从TensorFlow®-Keras
和Caffe
导入的模型执行迁移学习。
要加速对大型数据集的训练,您可以将计算和数据分布到桌面计算机上的多核处理器和GPU
中(使用Parallel Computing Toolbox™
),或者扩展到群集和云,包括Amazon EC2® P2
、P3
和 G3
GPU
实例(使用 MATLAB® Distributed Computing Server™
)。
平台
Windows 10
MATLAB 2018a
Deep Learning Toolbox
Computer Vision Toolbox
注:如果没有Deep Learning Toolbox
和Computer Vision Toolbox
,需要自己安装,在MATLAB
主页的APP
中,点击获取更多App
,在打开的附加功能资源管理器中,搜索这2个工具箱并下载安装即可。
一个简单的例子
在MATLAB官方文档中,提供了一些简单的入门实例。下面我们挑选第一个案例进行简单的分析。
使用 GoogLeNet 对图像进行分类
首先是使用一个典型的的深度卷积神经网络GoogLeNet
对图像进行分类。
GoogLeNet
已经对超过一百万个图像进行了训练,可以将图像分为1000
个对象类别(例如键盘、咖啡杯、铅笔和多种动物)。该网络已基于大量图像学习了丰富的特征表示。网络以图像作为输入,然后输出图像中对象的标签以及每个对象类别的概率。
加载预训练网络
1 | net = googlenet |
加载一个已知网络十分简单,直接令变量名等于网络名即可(第一次加载可能需要联网下载)。下面我们使用disp(net)
简单看一个googlenet
的内容:
每个net都有2个属性,即Layers
(网络层)和Connections
(层连接),Layers
为数组,指的是网络图层,指定为Layer
阵列。Connections
是表,图层连接,指定为具有两列的表。每个表行表示图层图中的连接。第一列Source
指定每个连接的源。第二列Destination
指定每个连接的目标。连接源和目标要么是图层名称,要么layerName/IOName
的窗体,其中IOName
是图层输入或输出的名称。
我们可以继续disp(net.Layers)
查看其网络结构:
可以看出,googlenet
一共有144层,第一列为网络名称,第二列为网络的类型,第三列为网络的具体参数。
这里我们需要网络结构里面的第一个和最后一个参数,即图像输入和分类类别,先定义2个变量保存该信息。1
2inputSize = net.Layers(1).InputSize;
classNames = net.Layers(end).ClassNames;
我们可以简单看下这2个参数里面的信息:
读取图像并调整图像大小
有了训练好的网络结构后,我们就可以用图片进行分类预测了。
首先读取一张图片,这里使用了官方文档里面的图片,然后要将其调整到网络需要的输入图片大小(否则会编译报错)。1
2I = imread('peppers.png');
I = imresize(I,inputSize(1:2));
使用imresize
将图像大小调整为网络的输入大小。调整大小会略微更改图像的纵横比。当然也可以使用更好的调整大小的函数。
B = imresize(A, [numrows numcols])
:numrows
和numcols
分别指定目标图像的高度和宽度。这里的numrows
和numcols
就是刚才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种形式:
其返回值label
就是scores
中数组最高的那个对应的label
,scores
是一个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)
其结果如下: