经典卷积神经网络——resnet

本文介绍了ResNet网络结构,特别是ResNet18的实现,通过残差模块和通道数翻倍的残差模块解决深度网络中准确率随层数增加而降低的问题。文章详细展示了ResNet18的网络结构、数据处理、损失函数、优化器设置、训练过程以及模型保存和测试。实验证明,ResNet18在加深网络层次的同时保持了良好的模型性能。


前言

随着深度学习的不断发展,从开山之作Alexnet到VGG,网络结构不断优化,但是在VGG网络研究过程中,人们发现随着网络深度的不断提高,准确率却没有得到提高,如图所示:
在这里插入图片描述
人们觉得深度学习到此就停止了,不能继续研究了,但是经过一段时间的发展,残差网络(resnet)解决了这一问题。


一、resnet

在这里插入图片描述
如图所示:简单来说就是保留之前的特征,有时候当图片经过卷积进行特征提取,得到的结果反而没有之前的很好,所以resnet提出保留之前的特征,
这里还需要经过一些处理,在下面代码讲解中将详细介绍。

二、resnet网络结构

在这里插入图片描述
本文将主要介绍resnet18

三、resnet18

1.导包

import torch
import torchvision.transforms as trans
import torchvision as tv
import torch.nn as nn
from torch.autograd import Variable
from torch.utils import data
from torch.optim import lr_scheduler

2.残差模块

这个模块完成的功能如图所示:
在这里插入图片描述

class tiao(nn.Module):
    def __init__(self,shuru,shuchu):
        super(tiao, self).__init__()
        self.conv1=nn.Conv2d(in_channels=shuru,out_channels=shuchu,kernel_size=(3,3),padding=(1,1))
        self.bath=nn.BatchNorm2d(shuchu)
        self.relu=nn.ReLU()
    def forward(self,x):
        x1=self.conv1(x)
        x2=self.bath(x1)
        x3=self.relu(x2)

        x4=self.conv1(x3)
        x5=self.bath(x4)
        x6=self.relu(x5)

        x7=x6+x

        return x7

2.通道数翻倍残差模块

模块完成功能如图所示:
在这里插入图片描述
在这个模块中,要注意原始图像的通道数要进行翻倍,要不然后面是不能进行相加。

class tiao2(nn.Module):
    def __init__(self,shuru):
        super(tiao2, self).__init__()
        self.conv1=nn.Conv2d(in_channels=shuru,out_channels=shuru*2,kernel_size=(3,3),
### MATLAB ResNet-50 卷积神经网络 图像分类教程 示例代码 在MATLAB中,ResNet-50是一种预训练的深度卷积神经网络模型,广泛用于图像分类任务。它基于ImageNet数据集训练而成,能够识别1000个不同的对象类别。以下是使用MATLAB中的ResNet-50进行图像分类的具体方法和示例代码[^3]。 #### 1. 加载预训练的ResNet-50模型 MATLAB提供了`resnet50`函数来加载预训练的ResNet-50模型。此模型可以直接用于图像分类任务,或者可以作为迁移学习的基础模型。 ```matlab % 加载预训练的ResNet-50模型 net = resnet50(); ``` #### 2. 准备输入图像 ResNet-50要求输入图像的大小为224×224×3。因此,在将图像传递给模型之前,需要对其进行适当的预处理,包括调整大小、归一化等。 ```matlab % 读取并显示图像 im = imread('peppers.png'); imshow(im); % 调整图像大小以匹配ResNet-50的要求 inputSize = net.Layers(1).InputSize; im = imresize(im, inputSize(1:2)); ``` #### 3. 使用ResNet-50进行预测 通过调用`classify`函数,可以对输入图像进行分类,并获取其预测标签。 ```matlab % 对图像进行分类 label = classify(net, im); disp(['Predicted Label: ', char(label)]); ``` #### 4. 获取预测概率 除了分类标签外,还可以通过`predict`函数获取每个类别的预测概率。 ```matlab % 获取预测概率 scores = predict(net, im); % 显示前五个最可能的类别 [~, indices] = maxk(scores, 5); probabilities = scores(indices); predictedLabels = net.Layers(end).Classes(indices); figure; for i = 1:length(indices) subplot(5, 1, i); bar(probabilities(i)); title(char(predictedLabels(i))); ylim([0 1]); end ``` #### 5. 迁移学习(可选) 如果需要针对特定任务微调ResNet-50模型,可以通过以下步骤实现: - 替换最后一层以适应新的分类任务。 - 设置训练选项。 - 训练模型。 ```matlab % 加载数据集 imds = imageDatastore('path_to_dataset', 'IncludeSubfolders', true, 'LabelSource', 'foldernames'); % 划分训练集和验证集 [imdsTrain, imdsValidation] = splitEachLabel(imds, 0.7, 'randomized'); % 替换最后一层 layers = layerGraph(net); newLayer = fullyConnectedLayer(numClasses); % numClasses是目标类别的数量 layers = replaceLayer(layers, 'fc1000', newLayer); % 添加softmax层和分类输出层 layers = addLayers(layers, [softmaxLayer classificationLayer]); % 设置训练选项 options = trainingOptions('sgdm', ... 'MiniBatchSize', 32, ... 'MaxEpochs', 10, ... 'InitialLearnRate', 1e-4, ... 'Shuffle', 'every-epoch', ... 'ValidationData', imdsValidation, ... 'ValidationFrequency', 10, ... 'Verbose', false, ... 'Plots', 'training-progress'); % 训练模型 trainedNet = trainNetwork(imdsTrain, layers, options); ``` --- ### 注意事项 - 确保安装了MATLAB的Deep Learning Toolbox,以便使用ResNet-50和其他深度学习功能[^3]。 - 如果数据集较大或模型复杂度较高,建议使用GPU加速训练过程。 ---
评论 144
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浅念念52

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值