发布时间:2024-07-20 18:01
做模式识别尤其是深度学习的小伙伴,十之八九都在使用Pytorch或Tensorflow完成着自己的idea。确实,如今的主流框架中,python凭借优秀的生态攻城略地,独领风骚。
但是对于很多刚刚入门深度学习的新手,尤其是用惯了Matlab又不熟悉python的小伙伴,并不要求有多么新颖且赶潮流的模型,那么这种情况下,Matlab提供的Deep Learning Toolbox可能就是你的第一选择。
今天咱么侧重实战,一起来学习一个Matlab环境下运用卷积神经神经网络(CNN)实现图像分类的小栗子,力争用最通俗的语言进行解释,闲话不多说,咱直接上干货。
环境要求:Matlab2018a及以上版本(18a版本开始提供Deep Learning Toolbox的工具箱,正式拉开了Matlab进军深度学习领域的序幕);
数据集:大多图像分类的Benchmark数据集都会使用到MNIST,但是由于使用的实在太多了,以及分类的难度确实不大,所以我们今天分享一个相似的但是难度稍大的数据集,名字叫notMNIST,附上数据集的链接:
http://yaroslavvb.blogspot.com/2011/09/notmnist-dataset.html
作者给出的数据集示例 自己选取部分数据显示的结果为了尽可能的把demo写的浅显易懂,也为了其他小伙伴可以直接套用此模型来跑自己的数据,我们尽可能地不使用复杂晦涩的函数,努力做到步子小一点,注释多一点。
demo中使用的数据集(下载后和程序放在一个文件夹下,不用改路径,直接运行程序即可):
链接:https://pan.baidu.com/s/1JnS6yfnoxTNg1d0_atpGHg
提取码:hw89
% 数据集来源:
以上代码主要实现了数据的导入以及数据集的随机划分,未使用一步到位的函数,这样大家就可以在工作区清楚的看到每一步是怎样实现的。这里解释randperm( )函数,其可随机产生一个和样本个数相同数目的序列,例如共有10个样本,那么randperm(10)的结果可能为
8 3 10 5 2 4 1 7 9 6
因此我们使用这个随机序列就可以实现数据集的随机划分,本程序设置训练集数据占50%,验证集数据占30%,测试集数据就占剩余的20%。数据集准备完成后,我们就开始搭建CNN网络
%% 定义网络层
这里定义的CNN网络又1个卷积层、1个池化层和1个全连接层组成,其中还使用了批量归一化操作,当然也可以加入dropout来防止过拟合。至于网络结构的设计就属于“炼丹”的范畴了,没有一个统一的标准,因人而异,需要大家自己慢慢体会了。
下面我们简单介绍没有验证集和有验证集的区别:
没有验证集:
% 参数
大家注意红框的几点,没有验证集合训练过程会迭代到最大迭代步数,并且左侧图像中没有验证集的曲线。这里有一个问题,如果我们遇到复杂的问题,模型中又缺少防止过拟合的操作(批量归一化,dropout,正则化或大数据集都可以防止过拟合),那么最终结果极有可能会出现过拟合,这当然是我们不想出现的情况。因此,如何判断模型训练是否“恰到好处”,我们应该引入验证集帮助我们进行判断。
存在验证集:
% 参数
options 中我们加入了更多的人为设置的参数,这样稍微高级的定义会使得模型训练的更符合你的要求。加入验证集后,我们可以看到训练过程“早停”了,Epoch只迭代了8次模型就训练过程就结束了,原因如绿框内容所示,Patience为5表示:如果5步迭代中验证集的loss都没有减小的话,训练就终止了。在绝大数情况下,这种早停的机制会防止模型过度训练从而出现过拟合的现象。
最终我们使用测试集验证模型的泛化能力即可,相应代码与结果如下
% 测试
测试集分类准确为92.0961%,效果还可以接受。如果你有兴趣,更换模型拓扑结构、优化算法、激活函数等等,可能会得到更好的分类结果。
今天分享的例子大家按照流程一步一步操作,肯定都能跑通,使用Matlab做深度学习适应于于以下人群:
1.熟悉Matlab但不熟悉Python语言的小伙伴;
2.刚刚接触深度学习,想要将理论迅速实现的小伙伴;
3.不需要state-of-art模型的,只需要将经典深度学习模型应用到自己研究领域的小伙伴
其中以上分享的Matlab中深度学习的代码,与Keras很像,都是“搭积木”的形式将模型拼凑起来而已,但是如果真的想进一步深入研究深度学习,或者是对现有模型进行改进创新,那么Matlab中提供的工具包集成度就显得太高了,pytorch或tensorflow或许更合适。但是不过怎么说,Matlab至少在深度学习领域迈出了一大步,可喜可贺。
这个专栏毕竟主要讲时间序列的相关内容,如果大家喜欢,下一步我会继续发布在Matlab环境下使用CNN或LSTM进行时间序列预测的各种demo。
如有问题私聊留言都欢迎,水平有限,如有错误,也请路过的大佬批评指正~~