当前位置: 首页 > news >正文

经典分类模型回顾5—DenseNet实现图像分类(matlab)

DenseNet,全称为Densely Connected Convolutional Networks,中文名为密集连接卷积网络,是由李沐等人在2017年提出的一种深度神经网络架构。 

DenseNet旨在解决深度神经网络中的梯度消失问题和参数数量过多的问题,通过构建密集连接的方式,使得网络能够更好地利用之前的特征,从而获得更好的性能。DenseNet的核心思想是:把网络中前面的层与后面的层进行连接,让前面的层的输出成为后面的层的输入。这样,整个卷积网络就变得非常紧凑,同时也避免了梯度消失的问题。

DenseNet的优点在于:参数少、计算速度快、准确率高。因此,DenseNet在图像识别、目标检测、图像分割等任务中都取得了很好的表现。

DenseNet是一种深度神经网络架构,它具有特殊的连接方式,可以有效地减少网络中的参数量,提高模型的准确性和稳定性。在图像分类任务中,DenseNet常常被使用。

在MATLAB中,可以使用深度学习工具箱来搭建和训练DenseNet模型。下面是一个简单的例子,展示如何使用深度学习工具箱来训练一个DenseNet模型进行CIFAR-10图像分类。

1. 准备数据

首先需要下载CIFAR-10数据集,可以使用MATLAB自带的数据集下载工具来获取数据集。

```MATLAB
cifar10Data = fullfile(tempdir, 'cifar-10-matlab');
if ~exist(cifar10Data, 'dir')
    cifar10Data = fullfile(toolboxdir('vision'), 'visiondata', 'cifar10');
    if ~exist(cifar10Data, 'dir')
        mkdir(cifar10Data);
        url = 'https://www.cs.toronto.edu/~kriz/cifar-10-matlab.tar.gz';
        helperCIFAR10Data.download(url, cifar10Data);
    end
end
```

2. 加载数据

使用 `imageDatastore` 函数将数据加载到MATLAB中。在此过程中,可以对图像进行增强处理,以提高模型的训练效果。

```MATLAB
% Load training and test data
[trainingImages, trainingLabels, testImages, testLabels] = helperCIFAR10Data.load(cifar10Data);

% Construct an imageDatastore object
trainingSet = imageDatastore(trainingImages, ...
    'labels', trainingLabels, ...
    'ReadFcn', @helperCIFAR10Data.readFunction);

testSet = imageDatastore(testImages, ...
    'labels', testLabels, ...
    'ReadFcn', @helperCIFAR10Data.readFunction);

% Prepare the data for training
inputSize = [32 32 3];
numClasses = 10;

% Apply data augmentation
augmentedTrainingSet = augmentedImageDatastore(inputSize, ...
    trainingSet, ...
    'ColorPreprocessing', 'gray2rgb', ...
    'RandCropSize', [28 28], ...
    'RandCropType', 'random', ...
    'RandRotation', [-8 8], ...
    'RandXReflection', true);
```

3. 构建DenseNet模型

使用 `densenet201` 函数从深度学习工具箱中加载DenseNet-201模型。

```MATLAB
net = densenet201;
```

可以使用 `analyzeNetwork` 函数来可视化模型架构。

```MATLAB
analyzeNetwork(net);
```

4. 训练模型

使用 `trainingOptions` 函数来配置训练选项。

```MATLAB
options = trainingOptions('sgdm', ...
    'InitialLearnRate', 0.001, ...
    'MaxEpochs', 50, ...
    'MiniBatchSize', 128, ...
    'VerboseFrequency', 50, ...
    'Plots', 'training-progress');
```

使用 `trainNetwork` 函数来训练模型。

```MATLAB
trainedNet = trainNetwork(augmentedTrainingSet, net, options);
```

5. 测试模型

使用 `classify` 函数来进行分类。

```MATLAB
predictedLabels = classify(trainedNet, testSet);
accuracy = mean(predictedLabels == testSet.Labels)
```

6. 可视化结果

使用 `montage` 函数来可视化测试集中的前20张图像及其分类结果。

```MATLAB
numImages = 20;
idx = randsample(numel(testSet.Files), numImages);
figure
montage(testSet.Files(idx), 'Size', [4 5]);
title('Test Images');

predictedLabels = classify(trainedNet, testSet);
label = cellstr(predictedLabels);
label = strcat(label, ", ", cellstr(num2str(testSet.Labels)));
groundTruth = cellstr(label);
groundTruth = strcat("Ground Truth: ", groundTruth);

predicted = cellstr(predictedLabels);
predicted = strcat("Prediction: ", predicted);

for i = 1:numImages
    text(i*32-25,32+10,groundTruth(idx(i)),'FontSize',8)
    text(i*32-25,32+20,predicted(idx(i)),'FontSize',8)
end
```

完整代码如下:

```MATLAB
cifar10Data = fullfile(tempdir, 'cifar-10-matlab');
if ~exist(cifar10Data, 'dir')
    cifar10Data = fullfile(toolboxdir('vision'), 'visiondata', 'cifar10');
    if ~exist(cifar10Data, 'dir')
        mkdir(cifar10Data);
        url = 'https://www.cs.toronto.edu/~kriz/cifar-10-matlab.tar.gz';
        helperCIFAR10Data.download(url, cifar10Data);
    end
end

[trainingImages, trainingLabels, testImages, testLabels] = helperCIFAR10Data.load(cifar10Data);

% Construct an imageDatastore object
trainingSet = imageDatastore(trainingImages, ...
    'labels', trainingLabels, ...
    'ReadFcn', @helperCIFAR10Data.readFunction);

testSet = imageDatastore(testImages, ...
    'labels', testLabels, ...
    'ReadFcn', @helperCIFAR10Data.readFunction);

% Prepare the data for training
inputSize = [32 32 3];
numClasses = 10;

% Apply data augmentation
augmentedTrainingSet = augmentedImageDatastore(inputSize, ...
    trainingSet, ...
    'ColorPreprocessing', 'gray2rgb', ...
    'RandCropSize', [28 28], ...
    'RandCropType', 'random', ...
    'RandRotation', [-8 8], ...
    'RandXReflection', true);

% Load pre-trained DenseNet-201 network
net = densenet201;

% Configure training options
options = trainingOptions('sgdm', ...
    'InitialLearnRate', 0.001, ...
    'MaxEpochs', 50, ...
    'MiniBatchSize', 128, ...
    'VerboseFrequency', 50, ...
    'Plots', 'training-progress');

% Train the network
trainedNet = trainNetwork(augmentedTrainingSet, net, options);

% Test the network
predictedLabels = classify(trainedNet, testSet);
accuracy = mean(predictedLabels == testSet.Labels)

% Visualize the results
numImages = 20;
idx = randsample(numel(testSet.Files), numImages);
figure
montage(testSet.Files(idx), 'Size', [4 5]);
title('Test Images');

predictedLabels = classify(trainedNet, testSet);
label = cellstr(predictedLabels);
label = strcat(label, ", ", cellstr(num2str(testSet.Labels)));
groundTruth = cellstr(label);
groundTruth = strcat("Ground Truth: ", groundTruth);

predicted = cellstr(predictedLabels);
predicted = strcat("Prediction: ", predicted);

for i = 1:numImages
    text(i*32-25,32+10,groundTruth(idx(i)),'FontSize',8)
    text(i*32-25,32+20,predicted(idx(i)),'FontSize',8)
end
```

http://www.lryc.cn/news/30424.html

相关文章:

  • 基于flask+bootstrap+echarts+mysql的鱼村小馆订餐后台管理系统
  • Spark使用Log4j将日志发送到Kafka
  • c++类与对象整理(上)
  • Docker学习(十九)什么是镜像的元数据?
  • Python如何获取弹幕?给你介绍两种方式
  • JAVA- AOP 面向切面编程 Aspect切面工具类 记录特定方法执行时的入参、执行时间、返参等内容
  • 「史上最全的 TCG 规范解读」TCG 规范架构概述(下)
  • GDScript 导出变量 (4.0)
  • JAVA知识点全面总结6:泛型反射和注解
  • 死代码删除(DCE,Dead Code Elimination)和激进的死代码删除(ADCE,Aggressive DCE)
  • 询问new bing关于android开发的15个问题(前景、未来、发展方向)
  • 【C++】初识类和对象
  • EPICS S7nodave手册
  • 2023最新版本RabbitMQ的持久化和简单使用
  • 函数式编程
  • 【Java 类】001-访问修饰符、命名规范
  • 【C++】命名空间
  • 【AutoSAR】【MCAL】Dio
  • 瑞吉外卖——day2
  • 了解java
  • 【编程实践】代码之中有创意:“我一直认为工程师世界上最具创造性的工作之一”
  • 【MySQL】表连接
  • 2023湖南省“楚怡杯”职业技能大赛“网络安全” 项目比赛任务书
  • Android应用启动优化笔记整理
  • 图像bytes字节串二进制转十六进制及bytes转为图像
  • 信息安全与数学基础-笔记-②同余
  • 网络安全法
  • django框架开发部署项目
  • Unity记录1.3-入门-第一阶段总结
  • Linux入门篇-文件管理