小标
2018-12-12
来源 :
阅读 1302
评论 0
摘要:本文主要向大家介绍了机器学习入门之快速入门深度学习(2)迁移学习,通过具体的内容向大家展现,希望对大家学习机器学习入门有所帮助。
本文主要向大家介绍了机器学习入门之快速入门深度学习(2)迁移学习,通过具体的内容向大家展现,希望对大家学习机器学习入门有所帮助。
有点神经网络基础的基础就会看得明白,上次的例子就是拿已经训练好的网络去用一下嘛,根本无关什么“深度学习”,完全可以把AlexNet看做一个分类器,把待分类的数据丢进去就可以了。
这次咱们要“学习”一把了,针对特定的任务构造自己的分类器了。这次咱们仍然使用AlexNet的网络结构(谁让它经典呢),训练这个网络让它为咱们服务。
在正式Coding之前,首先了解下什么是迁移学习。所谓的迁移学习就是指在深度学习中,把一个学习好的深度网络,稍加改造变成自己特有网络的意思,至于这样做的道理,咱们这里先不深入探讨,只要先记住迁移学习有个很大的好处,就是网络收敛速度快。
实验准备
Matlab2017b或者更新的版本,AlexNet。
数据准备:为了实验的一致性,使用Matlab计算机视觉工具箱自带的数据。
开始编程
载入数据
unzip('MerchData.zip');
imds = imageDatastore('MerchData','IncludeSubfolders',true,'LabelSource','foldernames');
[imdsTrain,idmsValidation] =splitEachLabel(imds,0.7,'randomized');
unzip函数的意思是解压压缩文件。执行这一句之后可以看到在当前目录下多了一个文件夹:
这个文件夹里面就是本次实验所使用的数据。为了更方便地组织该数据,我们使用imageDatastore函数来构造一个数据结构,用以管理数据。执行上面一句之后得到来一个imageDatastore数据结构,我们进入当前的工作空间对其进行观察。
可以看到待使用的数据,被一个数据结构进行了组织,并且使用文件夹的名称作为了类标签。我们随机选择16个图像用 的方式进行显示。
numImages= numel(imds.Labels);%统计总数
idx =randperm(numImages,16); %随机选择
figure
for i = 1:16
subplot(4,4,i)
I = readimage(imds,idx(i));
imshow(I)
end
可以看到
我们接下来把图像分为测试集(30%)和训练集(70%):
[imdsTrain,idmsValidation]= splitEachLabel(imds,0.7,'randomized');
数据准备完毕了。
加载AlexNet网络
由于我们这一章讲的是迁移学习,所以接下来需要加载已经训练好的alexnet网络。关于如何加载请参看前一章。
net =alexnet;
修改网络
由于咱们这次只需要识别5个类,所以需要对AlexNet网络进行修改以适应当前的问题。我们这次主要对其进行如下修改:修改全连接层的输出数量,从原来的1000变为5,其余保持不变。首先提取出前面的层数,然后使用fullyConnectedLayer构造全连接层,最后完成整个网络的构建。
layersTransfer= net.Layers(1:end-3);
layers =[
layersTransfer
fullyConnectedLayer(5,'WeightLearnRateFactor',20,'BiasLearnRateFactor',20)
softmaxLayer
classificationLayer];
最后的结果layer就是我们需要的网络结构,此时网络还未经训练。
训练网络
训练网络在Matlab中是一件非常简单的事情,我们只需要配置好训练参数就好了:
options = trainingOptions('sgdm',...
'MiniBatchSize',10, ...
'MaxEpochs',6, ...
'InitialLearnRate',1e-4, ...
'ValidationData',idmsValidation, ...
'ValidationFrequency',3, ...
'ValidationPatience',Inf, ...
'Verbose',false, ...
'Plots','training-progress');
关于训练的参数,咱们以后再详细介绍,这里需要了解的一点就是,由于神经网络参数众多,而且是一个典型的非凸优化问题,所以,训练的参数选择相当重要。
netTransfer = trainNetwork(imdsTrain,layers,options);
运行完上面一句就可以得到netTransfer作为迁移网络。
验证网络
我们使用验证集去测试神经网络的有效性:
YPred = classify(netTransfer,idmsValidation);
accuracy = mean(YPred == idmsValidation.Labels)
结果表明我们的训练出来的神经网络具有良好的泛化性。
总结
从上面的编程过程中,可以发现Matlab神经网络工具箱已经帮助我们做好了很多工作,我们只需要去设计网络即可,然后训练即可,把广大程序员从无边无际的codeing中解放出来。
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标人工智能机器学习频道!
喜欢 | 0
不喜欢 | 0
您输入的评论内容中包含违禁敏感词
我知道了

请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号