首页 > 其他分享 >神经网络-卷积神经网络案例详解

神经网络-卷积神经网络案例详解

时间:2024-06-12 20:58:34浏览次数:21  
标签:nn 卷积 self 神经网络 详解 CNN import 模型

标题:基于卷积神经网络的图像分类:一个简单的CNN架构实现与训练
在深度学习领域,模型架构的设计对于模型的性能和计算效率至关重要。本文将介绍如何使用PyTorch库和Hugging Face的Transformers库来构建一个简单的卷积神经网络(CNN)模型,用于图像分类任务。我们将详细解释模型的架构和训练过程,并展示如何在CIFAR-10数据集上进行训练和评估。

1. 模型架构

1.1 卷积层

在图像分类任务中,卷积层是CNN的核心组件。卷积层通过滑动小的滤波器(kernel)来识别图像中的重复模式。本文中,我们定义了两个卷积层:self.conv1self.conv2,分别有6个和16个输出通道,卷积核大小为3x3。

1.2 激活函数

在每个卷积层之后,我们使用ReLU激活函数。ReLU是一个非线性函数,能够引入非线性特性,使网络能够学习更复杂的特征。

1.3 池化层

池化层用于减小特征图的尺寸,减少参数数量,并且可以减少过拟合的风险。本文中,我们定义了两个池化层:self.pool1self.pool2,池化窗口大小为2x2,步长为2。

1.4 全连接层

全连接层用于将特征图的输出转换为最终的分类结果。本文中,我们定义了三个全连接层:self.linear1self.linear2self.out,输入特征数分别为576、120和84,输出类别数为10(CIFAR10有10个类别)。

1.5 模型总结

本文中的模型是一个简单的CNN架构,具有以下特点:

  • 简化性:这是一个非常基础的模型,适合作为学习CNN架构的起点。
  • 计算效率:由于模型的结构相对简单,它在计算上相对高效,适合于资源受限的环境。
  • 可扩展性:模型可以很容易地通过添加更多的层或改变层的大小来扩展,以提高性能。
  • 模块化:模型的各个部分(如卷积层、池化层和全连接层)可以独立地研究和改进。

2. 训练过程

2.1 数据加载与预处理

我们使用PyTorch的CIFAR10数据集,并通过ToTensor转换将图像数据转换为PyTorch张量。我们还定义了一个Compose转换,用于组合多个转换。

2.2 模型实例化与训练

我们定义了一个名为ImageClassification的类,该类继承自nn.Module。在类的__init__方法中,定义了一系列的网络层,包括卷积层、池化层和全连接层。在train函数中,我们使用交叉熵损失函数和Adam优化器进行训练。

2.3 模型评估

我们定义了一个名为test07的函数,用于在验证数据集上评估模型的性能。该函数使用DataLoader加载验证数据集,并使用pipeline进行情感分析。

3. 结论

本文介绍了一个简单的CNN架构,用于图像分类任务。我们详细解释了模型的架构和训练过程,并展示了如何在CIFAR-10数据集上进行训练和评估。通过调整模型架构和训练参数,可以进一步提高模型的性能。这个简单的模型是一个很好的起点,可以用来理解CNN的工作原理,并且可以作为基础模型,在实际应用中进行调整和优化。

from torchsummary import summary
import torch
import torch.nn as nn
from torchvision.datasets import CIFAR10
from torchvision.transforms import ToTensor
from torchvision.transforms import Compose
import torch.optim as optim
from torch.utils.data import DataLoader
import time
import matplotlib.pyplot as plt
from torchsummary import summary

from CNN_example.example_fenlei import create_dataset

BATCH_SIZE = 8


class ImageClassification(nn.Module):
    # 定义网络结构
    def __init__(self):
        super(ImageClassification, self).__init__()
        # 定义网络层:卷积层+池化层
        # 第一个卷积层:输入通道数 3,输出通道数 6,步长 1,卷积核大小 3x3
        self.conv1 = nn.Conv2d(3, 6, stride=1, kernel_size=3)
        # 第一个池化层:池化窗口大小 2x2,步长 2
        self.pool1 = nn.MaxPool2d(kernel_size=2, stride=2)
        # 第二个卷积层:输入通道数 6,输出通道数 16,步长 1,卷积核大小 3x3
        self.conv2 = nn.Conv2d(6, 16, stride=1, kernel_size=3)
        # 第二个池化层:池化窗口大小 2x2,步长 2
        self.pool2 = nn.MaxPool2d(kernel_size=2, stride=2)
        # 全连接层
        # 第一个全连接层:输入特征数 576,输出特征数 120
        self.linear1 = nn.Linear(576, 120)
        # 第二个全连接层:输入特征数 120,输出特征数 84
        self.linear2 = nn.Linear(120, 84)
        # 输出层:输入特征数 84,输出类别数 10(CIFAR10 有 10 个类别)
        self.out = nn.Linear(84, 10)

    # 定义前向传播
    def forward(self, x):
        # 卷积+relu+池化
        x = torch.relu(self.conv1(x))
        x = self.pool1(x)
        # 卷积+relu+池化
        x = torch.relu(self.conv2(x))
        x = self.pool2(x)
        # 将特征图做成一个向量的形式:相当于特征向量
        x = x.reshape(x.size(0), -1)
        # 全连接层
        x = torch.relu(self.linear1(x))
        x = torch.relu(self.linear2(x))
        # 返回输出结果
        return self.out(x)


'''
todo 架构意义解释:

在深度学习中,模型架构的设计是非常关键的,它决定了模型能够处理的数据类型、模型的计算复杂度以及模型的性能。对于图像分类任务,常见的模型架构包括卷积神经网络(CNN)和循环神经网络(RNN)等。在这个特定的例子中,使用的是卷积神经网络(CNN)架构,这是因为 CNN 非常适合处理具有固定尺寸和连续空间的图像数据。
这个 `ImageClassification` 类定义了一个简单的 CNN 架构,它包含以下几个关键部分:
1. **卷积层**:`self.conv1` 和 `self.conv2`,用于捕捉图像的局部特征。卷积操作通过滑动一个小的滤波器(kernel)来识别图像中的重复模式。
2. **ReLU 激活函数**:在每个卷积层之后使用 ReLU 激活函数,它是一个非线性函数,能够引入非线性特性,使网络能够学习更复杂的特征。
3. **池化层**:`self.pool1` 和 `self.pool2`,用于减小特征图的尺寸,减少参数数量,并且可以减少过拟合的风险。池化操作通常使用最大池化(`nn.MaxPool2d`)或平均池化(`nn.AvgPool2d`)。
4. **全连接层**:`self.linear1`、`self.linear2` 和 `self.out`,用于将特征图的输出转换为最终的分类结果。全连接层在卷积神经网络的最后阶段使用,以实现分类任务。
5. **reshape 操作**:在将特征图转换为向量之前,使用了 `x.reshape(x.size(0), -1)`,这是为了将二维特征图转换为一维特征向量,以适应全连接层的输入要求。
这个模型的设计具有以下意义:
- **简化性**:这是一个非常基础的模型,适合作为学习 CNN 架构的起点。
- **计算效率**:由于模型的结构相对简单,它在计算上相对高效,适合于资源受限的环境。
- **可扩展性**:模型可以很容易地通过添加更多的层或改变层的大小来扩展,以提高性能。
- **模块化**:模型的各个部分(如卷积层、池化层和全连接层)可以独立地研究和改进。
在实际应用中,为了提高性能,通常会使用更复杂的模型架构,包括更多的层、更复杂的激活函数和更高级的优化技术。但是,这个简单的模型仍然是一个很好的起点,可以用来理解 CNN 的工作原理,并且可以作为基础模型,在实际应用中进行调整和优化。




'''


def train(model, train_dataset):
    # 定义损失函数:交叉熵损失函数
    criterion = nn.CrossEntropyLoss()

    # 定义优化器:使用 Adam 优化器,学习率设置为 1e-3
    optimizer = optim.Adam(model.parameters(), lr=1e-3)

    # todo  损失函数 与优化器最重要 决定了训练的质量和时间 上来就要选型

    # 定义训练的轮数
    epoch = 20

    # 循环遍历训练轮数
    for epoch_idx in range(epoch):
        # 创建数据加载器:使用训练数据集,批量大小为 BATCH_SIZE,打乱数据顺序
        dataloader = DataLoader(train_dataset, batch_size=BATCH_SIZE, shuffle=True)
        # 初始化样本数量和总损失
        sam_num = 0
        total_loss = 0.0
        # 开始计时
        start = time.time()

        # 遍历数据加载器中的每个批次
        for x, y in dataloader:
            # 将输入图像 x 通过模型进行前向传播
            output = model(x)
            # 计算损失
            loss = criterion(output, y)
            # 清空优化器中的梯度
            optimizer.zero_grad()
            # 反向传播损失
            loss.backward()
            # 应用梯度更新模型参数
            optimizer.step()
            # 累加损失
            total_loss += loss.item()
            # 累加样本数量
            sam_num += 1

        # 打印当前轮数、平均损失和耗时
        print('epoch: %2s loss: %.5f time: %.2fs' % (epoch_idx + 1, total_loss / sam_num, time.time() - start))

        # 保存模型状态字典到文件
        torch.save(model.state_dict(), 'data/image_classification.pth')


def test07(valid_dataset):
    # 创建数据加载器:使用验证数据集,批量大小为 BATCH_SIZE,打乱数据顺序
    dataloader = DataLoader(valid_dataset, batch_size=BATCH_SIZE, shuffle=True)

    # 实例化模型
    model = ImageClassification()
    # 从文件中加载模型的状态字典,以便使用已经训练好的模型进行预测
    model.load_state_dict(torch.load('data/image_classification.pth'))

    # 将模型设置为评估模式,关闭梯度计算和 Dropout 等正则化层
    # todo 作用: 将模型设置为评估模式是为了在评估模型时保持一致性和性能,避免由于训练相关的特性(如 Dropout 和 BatchNorm)对模型性能产生不利影响。
    model.eval()

    # 初始化正确预测的样本数量和总样本数量
    total_correct = 0
    total_samples = 0

    # 遍历数据加载器中的每个批次
    for x, y in dataloader:
        # 使用模型进行前向传播,得到预测输出
        output = model(x)
        # 计算预测结果与真实标签的一致性
        correct = (torch.argmax(output, dim=-1) == y).sum()
        # 累加正确预测的样本数量
        total_correct += correct.item()
        # 累加总样本数量
        total_samples += len(y)

    # 打印模型的准确率
    print('Acc: %.2f' % (total_correct / total_samples))


# 主函数
if __name__ == '__main__':
    # 实例化模型
    model = ImageClassification()
    # 实例化数据集
    train_dataset = create_dataset()
    # 调用 train 函数进行训练
    train(model, train_dataset)

    # 数据集加载
    train_dataset, valid_dataset = create_dataset()
    # 模型实例化
    model = ImageClassification()
    # 模型预测
    test07(valid_dataset)

标签:nn,卷积,self,神经网络,详解,CNN,import,模型
From: https://blog.csdn.net/qq_45003504/article/details/139585080

相关文章

  • NumPy 舍入小数、对数、求和和乘积运算详解
    舍入小数在NumPy中,主要有五种方法来舍入小数:截断去除小数部分,并返回最接近零的浮点数。使用trunc()和fix()函数。示例:importnumpyasnparr=np.trunc([-3.1666,3.6667])print(arr)相同的示例,使用fix():importnumpyasnparr=np.fix([-3.1666,3.6667])......
  • 普通卷积和深度可分离卷积的区别?通俗易懂
    普通卷积:参数量是:3✖3✖3✖4第一个3是原图,后面的3✖3是卷积核,4是输出的深度可分离卷积:参数量是:3✖3✖3第一个3是原图,后面的3✖3是卷积核,因为输出是独立的没有交互所以就没有✖4一般提取特征需要通道信息交互,而这样的话就会损失特征所以下面进行的1✖1的卷积(逐点卷积)......
  • 基于卷积神经网络的花卉识别
    前言本文介绍卷积神经网络的入门案例,通过搭建和训练一个模型,来对几种常见的花朵进行识别分类;使用到TF的花朵数据集,它包含5类,即:“雏菊”,“蒲公英”,“玫瑰”,“向日葵”,“郁金香”;共3670张彩色图片;通过搭建和训练卷积神经网络模型,对图像进行分类,能识别出图像是“蒲公英”,或“玫瑰......
  • 深度详解帮助手册,让企业告别低效率
    引言在这个高速发展的商业时代,企业之间的竞争愈发激烈。效率成为衡量企业竞争力的关键指标。而帮助手册,这一传统的信息载体,正在以全新的姿态帮助企业提升效率。本文将为您深度解析如何利用帮助手册摆脱低效率的窘境,同时介绍创新产品HelpLook如何在这一领域发挥作用。一、什......
  • Python中用PyTorch机器学习神经网络分类预测银行客户流失模型|附代码数据
    阅读全文:http://tecdat.cn/?p=8522最近我们被客户要求撰写关于神经网络的研究报告,包括一些图形和统计输出。分类问题属于机器学习问题的类别,其中给定一组特征,任务是预测离散值。分类问题的一些常见示例是,预测肿瘤是否为癌症,或者学生是否可能通过考试在本文中,鉴于银行客户的某些......
  • docker安装详解
    docker安装详解说明:本次使用的宿主机为阿里云服务器,发行版为Ubuntu22.04.41,配置linux内核流量转发功能#因为docker和宿主机的端口映射,本质是内核的流量转发功能$cat<<EOF>/etc/sysctl.d/docker.confnet.bridge.bridge-nf-call-ip6tables=1net.bridge.bridge-nf-ca......
  • nginx脚本原理(复杂变量)详解
    本文将结合实际的源码来探讨nginx的脚本实现原理,并会在最后对此进行总结。本次只展示复杂变量,对于其if等指令后续文章再来探讨。nginx的脚本支持使其具备了强大的灵活性,我们可以使用简单的脚本指令配置,进行灵活的功能定制。欲了解此功能,必先了解其变量的实现原理.(nginx变量),......
  • CDH详解(史上最全)
    工作记录知识研究CDH概览CDH(ClouderaDistributionIncludingApacheHadoop)是由Cloudera公司提供的一个集成了ApacheHadoop以及相关生态系统的发行版本。CDH是一个大数据平台,简化和加速了大数据处理分析的部署和管理。CDH提供Hadoop的核心元素-可伸缩存储和分布式计算-以......
  • 大模型「训练」与「微调」概念详解【6000字长文】
    本文你将学到什么1、大模型预训练与微调的基本流程2、预训练、训练、后期预训练、微调的区别3、大模型训练与微调的一些概念,如:Post-pretrain、SFT、RLHF、模型对齐、Lora、Q-Lora、大模型量化、微调指标、微调参数、大模型评测指标预训练与微调概览在大模型的预训练与微......
  • ubuntu在apt安装时出现的弹窗详解
    在一个全新安装的Ubuntu22.04LTS上,每次使用apt安装或更新软件包时,会出现一个Daemonsusingoutdatedlibraries弹窗,Whichserviceshouldberestarted?大概是下面这个样子: 这让我想起了windows上每次打开一个应用都会弹窗提示安全提醒,异曲同工啊。一脸懵的情况下,只能一......