本文同时发布于知乎(用户名Haoran),如需转载,请注明出处。
目录
前言
一、利用现成网络进行分类
二、构建简单的分类网络
三、迁移学习
前言
Matlab从2016a版本开始提供了深度学习的相关工具,可以很方便地构建自己的网络或下载一些现成的经典网络(如AlexNet,GoogLeNet和VGG系列)进行迁移学习。作为一个初学者,我粗浅地认为,对于深度学习,我们实际的操作步骤可以分三大块:数据集(包括载入图片,制作训练集验证集,送入网络前对图片进行预处理),构建网络和选择训练方式。本文将基于Matlab2017b,紧抓这三块,基于3个Matlab的官方示例,分享Matlab深度学习工具的初步试玩心得。
一、利用现成网络进行分类
该部分将利用GoogLeNet进行图片分类,目的在于通过介绍几个内置函数的使用,演示如何在Matlab2017b中进行现成网络的下载,如何调整图片尺寸以与网络输入层相符,以及怎么将下载的网络运用在单独的一张图片上进行测试。
1、载入网络
在使用GoogLeNet之前,需要在add-one explorer上进行下载安装,同时界面上会介绍网络的相关使用方式(由于GoogLeNet过于复杂,在此不展示其内部结构):
根据上述内容,载入GoogLeNet:
net = googlenet;
2、调整图片尺寸
Matlab官方示例的图片是经过预先裁剪处理后的,最终运行得精确度在95%左右,现在我们随便选择一张未经预处理的桌面壁纸(1920X1080)进行测试,看效果如何。
调整图片尺寸的目的是为了与网络输入层参数相匹配,因此我们需要首先获取GoogLeNet输入层参数:
inputSize = net.Layers(1).InputSize;
调整图片尺寸,在此我们需要用到imread()和imresize()两个函数:
%读入图像
B = imread('bird.jpg');
%重设图像尺寸,若inputSize=[227 227 3],则inputSize[1:2]=[227 227],相当于取inputSize前两维
B = imresize(B, inputSize(1:2));
3、图片分类测试
现在,将调整后的图片送入GoogLeNet进行测试:
figure
imshow(B)
%取Googlenet输出层最后能分辨的对象类别
classNames = net.Layers(end).ClassNames;
title(string(label) + "," + num2str(100*scores(classNames == label), 4) + "%");
测试结果显示图片内容有51.65%的可能性为brambling(燕雀),由于测试图片含有大量背景干扰,仅图片大约中间位置为待测对象,而不论图片中的是否为燕雀,预测结果的大方向是可以接受的。
二、构建简单的分类网络
该部分将实现一个简单分类网络的构建并在新数据集上运行测试,目的在于熟悉深度学习的核心步骤,并通过介绍几个内置函数的使用实现从载入数据、构建网络、训练网络到作出预测的整个流程。
1、数据集处理
假设我们已获取所需图片,并人为将其分门别类放置于地址'D:\Matlab\ImageData'下的各子文件夹中(如本例数据集中含写有数字0-9的图片,我们