基于MATLAB的Alexnet迁移学习进行猫狗分类(数据集:Kaggle)

基本介绍

  • 软件:Matlab R2018b
  • 数据集:Kaggle猫狗数据集
  • 网络:AlexNet

前期准备

数据集

Kaggle猫狗数据集猫与狗用于训练的图片(train)分别12500张,每张图片的尺寸大小都是有差异的,图片的命名格式为标签+标号。
【数据集度云链接】
链接:https://pan.baidu.com/s/17c4K04kDKDUsuXdLkPecKA
提取码:8rhn
在这里插入图片描述
在这里,将两种图片分别放在两个文件夹下,文件夹用标签命名。这样做主要是便于使用Matlab自身构建数据集的函数。(下文中将标注)
在这里插入图片描述

MATLAB中的AlexNet

直接在命令窗口输入下列命令,若没有该网络结构,软件会报错并提示下载。下载方法不在这里赘述。

net = alexnet;

读取并预处理数据集

1.读取原始数据集

imds = imageDatastore('E:\kaggle\train', ... 
    'IncludeSubfolders',true, ...
    'LabelSource','foldernames');

函数说明

imds = imageDatastore(location,Name,Value)
location 数据集位置(文件夹地址)
IncludeSubfolders 子文件夹包含标记(使用前文中提到的文件夹分类并命名)true为指定,false为不指定,默认不指定
FileExtensions 图像文件扩展名,指定读取某一类型的图片文件,这里不指定

在这里使用IncludeSubfolders标定图片的标签可以省去很多不必要的步骤。但不是很适合训练集打乱的情况。

2.读取数据集数量

numTrainImages = numel(imds.Labels);

这一行代码实质是打印数据集中所有的标签,再统计标签总数以达到统计训练集图片总数。

3.统一图片尺寸

AlexNet默认输入图片尺寸为227×227×3,其中3指的是彩色图片的三通道。所以我们需要把数据集中的图片统一比例与像素大小。

for i = 1:numTrainImages
    s = string(imds.Files(i));
    I = imread(s);
    I = imresize(I,[227,227]);
    imwrite(I,s);
    s
end

这个循环函数,imds.Files的作用是读取数据集中所有图片的地址,然后逐一读取改尺寸。

4.分割数据集

在这里有两种方式生成训练数据集与测试数据集:
1.按比例分割数据集
2.使用官方测试数据集

按比例分割数据集

[imdsTrain,imdsValidation] = splitEachLabel(imds,0.7,'randomized');

这行代码主要功能是将原数据集imds7:3分割为训练数据集imdsTrain与测试数据集imdsValidation,分割挑去方式为随机。

官方测试数据集

imdsTrain = imds
imdsValidation = imageDatastore('E:\kaggle\test', ... 
    'IncludeSubfolders',true, ...
    'LabelSource','foldernames');

读取方法与第一步的方法相同。

在这里使用第一种方法

AlexNet网络

1.读取原始AlexNet

net = alexnet;

inputSize = net.Layers(1).InputSize

layersTransfer = net.Layers(1:end-3);

numClasses = numel(categories(imdsTrain.Labels));

inputSize 读取该网络输入图片的尺寸
layersTransfer 获取AlexNet后三层之外的网络,保持不变
numClasses 获取以确定的数据集标签数(即分类数量,猫狗分类数量为2)

2.组建新网络

layers = [
    layersTransfer
    fullyConnectedLayer(numClasses,'WeightLearnRateFactor',20,'BiasLearnRateFactor',20)
    softmaxLayer
    classificationLayer];

这里主要是更改最后全连接层。

训练AlexNet网络

指定训练选项。对于迁移学习,请保留预训练网络的较浅层中的特征(迁移的层权重)。要减慢迁移的层中的学习速度,请将初始学习速率设置为较小的值。在上一步中增大了全连接层的学习率因子,以加快新的最终层中的学习速度。这种学习率设置组合只会加快新层中的学习速度,对于其他层则会减慢学习速度。执行迁移学习时,所需的训练轮数相对较少。一轮训练是对整个训练数据集的一个完整训练周期。指定小批量大小和验证数据。软件在训练过程中每 ValidationFrequency 次迭代验证一次网络。

options = trainingOptions('sgdm', ...
    'MiniBatchSize',10, ...
    'MaxEpochs',6, ...
    'InitialLearnRate',1e-4, ...
    'Shuffle','every-epoch', ...
    'ValidationData',augimdsValidation, ...
    'ValidationFrequency',3, ...
    'Verbose',false, ...
    'Plots','training-progress');

训练网络

netTransfer = trainNetwork(augimdsTrain,layers,options);

在这里插入图片描述
其实由于AlexNet本身的结构问题,Accuracy基本上也就是在92%上下波动,再加上迁移学习可以节省很多时间,所以其实可以使用很少的数据集,100张左右都是差不了太多的。(训练25000张其实最终结果没太大差别)

测试网络

idx = randperm(numel(imdsValidation.Files),20);
[YPred,scores] = classify(netTransfer,augimdsValidation);

在上文中提到的测试数据集中随机抽取20张作为本次测试的数据集idx

figure
for i = 1:20
    subplot(5,4,i)
    I = readimage(imdsValidation,idx(i));
    imshow(I)
    label = YPred(idx(i));
    title(string(label));
end

逐一测试并展示出来
在这里插入图片描述
肉眼检测一下,发现左下角的小黑狗被错误识别成猫了。但是整体结果还算可以。
在这里插入图片描述

结语

总的来说,通过AlexNet迁移学习猫狗分类是相当简单的。只需要改少许代码,就可以实现其他的多分类任务。
这里只是核心代码,做一下GUI便是可以作为某一期末课程设计了。在这里附上简单的GUI界面:
在这里插入图片描述

全部代码

imds = imageDatastore('E:\kaggle\train', ...
    'IncludeSubfolders',true, ...
    'LabelSource','foldernames');

numTrainImages = numel(imds.Labels);

for i = 1:numTrainImages
    s = string(imds.Files(i));
    I = imread(s);
    I = imresize(I,[227,227]);
    imwrite(I,s);
    s
end

[imdsTrain,imdsValidation] = splitEachLabel(imds,0.7,'randomized');

net = alexnet;

inputSize = net.Layers(1).InputSize

layersTransfer = net.Layers(1:end-3);

numClasses = numel(categories(imdsTrain.Labels));

layers = [
    layersTransfer
    fullyConnectedLayer(numClasses,'WeightLearnRateFactor',20,'BiasLearnRateFactor',20)
    softmaxLayer
    classificationLayer];

augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsValidation);

options = trainingOptions('sgdm', ...
    'MiniBatchSize',10, ...
    'MaxEpochs',10, ...
    'InitialLearnRate',1e-4, ...
    'Shuffle','every-epoch', ...
    'ValidationData',augimdsValidation, ...
    'ValidationFrequency',3, ...
    'Verbose',false, ...
    'Plots','training-progress');

netTransfer = trainNetwork(augimdsTrain,layers,options);
  • 40
    点赞
  • 253
    收藏
    觉得还不错? 一键收藏
  • 44
    评论
基于matlab迁移学习+深度学习来实现汽车细粒度识别模型的定制+安装到iphone上(搭建一个多功能汽车识别系统).zip基于matlab迁移学习+深度学习来实现汽车细粒度识别模型的定制+安装到iphone上(搭建一个多功能汽车识别系统).zip基于matlab迁移学习+深度学习来实现汽车细粒度识别模型的定制+安装到iphone上(搭建一个多功能汽车识别系统).zip基于matlab迁移学习+深度学习来实现汽车细粒度识别模型的定制+安装到iphone上(搭建一个多功能汽车识别系统).zip基于matlab迁移学习+深度学习来实现汽车细粒度识别模型的定制+安装到iphone上(搭建一个多功能汽车识别系统).zip基于matlab迁移学习+深度学习来实现汽车细粒度识别模型的定制+安装到iphone上(搭建一个多功能汽车识别系统).zip基于matlab迁移学习+深度学习来实现汽车细粒度识别模型的定制+安装到iphone上(搭建一个多功能汽车识别系统).zip基于matlab迁移学习+深度学习来实现汽车细粒度识别模型的定制+安装到iphone上(搭建一个多功能汽车识别系统).zip 【资源说明】 1、该资源内项目代码都是经过测试运行成功,功能正常的情况下才上传的,请放心下载使用。 2、适用人群:主要针对计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、数学、电子信息等)的同学或企业员工下载使用,具有较高的学习借鉴价值。 3、不仅适合小白学习实战练习,也可作为大作业、课程设计、毕设项目、初期项目立项演示等,欢迎下载,互相学习,共同进步!
### 回答1: 要在MATLAB中下载AlexNet模型,可以按照以下步骤进行操作: 1. 首先,确保你已经安装并启动了MATLAB软件。 2. 在MATLAB命令行窗口中输入以下命令: ```matlab net = alexnet; ``` 这将会自动下载并加载AlexNet模型,同时创建一个名为`net`的变量。 3. 如果你之前从未下载过AlexNet模型,MATLAB会提示你下载一个由MathWorks提供的模型。你可以点击“Download”按钮来下载模型。下载的模型将以`.mat`文件的形式保存在你的本地目录中。 注意:如果你在MATLAB命令行窗口中看到一个警告消息,提示你应该使用深度学习工具箱,你需要确保已经安装了该工具箱才能成功下载和使用AlexNet模型。 4. 下载完成后,你可以通过访问`net`变量来使用AlexNet模型。例如,你可以通过以下命令查看模型的结构: ```matlab disp(net); ``` 这将会在MATLAB命令行窗口中显示模型的层级结构和参数信息。 通过以上步骤,你就可以成功地在MATLAB中下载和使用AlexNet模型了。 ### 回答2: 要在MATLAB中下载AlexNet模型,可以按照以下步骤操作: 首先,打开MATLAB软件,并确保已连接到互联网。 接下来,打开命令窗口并输入以下命令来下载预训练的AlexNet模型: ``` net = alexnet; ``` 此命令将自动从MathWorks网站下载AlexNet模型并保存为MATLAB格式。 下载完成后,您可以使用以下命令来查看模型的详细信息: ``` disp(net); ``` 这将显示AlexNet模型的架构和参数。 如果需要使用AlexNet模型对不同的数据集进行微调训练,可以使用以下命令来下载网络结构: ``` net = alexnet('Weights','none'); ``` 如需使用ImageNet数据集上的预先训练好的权重,可以使用以下命令: ``` net = alexnet('Weights','imagenet'); ``` 通过使用这些简单的MATLAB命令,您可以轻松地下载和使用AlexNet模型进行深度学习任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 44
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值