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

卷积神经网络(CNN)对 CIFAR-10 数据集进行图像分类

代码功能

数据预处理:使用 transforms 对图像进行归一化和转换。
模型定义:SimpleCNN 包含两层卷积层和两层全连接层,使用 ReLU 激活函数和最大池化层。
优化器和损失函数:使用 Adam 优化器和交叉熵损失函数。
训练循环:模型经过若干个 epoch 的训练,每次更新权重。
测试评估:在测试集上评估模型的准确性。
在这里插入图片描述

代码

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader

# 超参数
batch_size = 64
learning_rate = 0.001
num_epochs = 10

# 数据预处理
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))  # 将像素值归一化到 [-1, 1]
])

# CIFAR-10 数据集
train_dataset = datasets.CIFAR10(root='./data', train=True, transform=transform, download=True)
test_dataset = datasets.CIFAR10(root='./data', train=False, transform=transform, download=True)

train_loader = DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False)

# 定义CNN模型
class SimpleCNN(nn.Module):
    def __init__(self):
        super(SimpleCNN, self).__init__()
        self.conv1 = nn.Conv2d(3, 32, kernel_size=3, stride=1, padding=1)
        self.relu = nn.ReLU()
        self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
        self.conv2 = nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1)
        self.fc1 = nn.Linear(64 * 8 * 8, 256)
        self.fc2 = nn.Linear(256, 10)

    def forward(self, x):
        x = self.conv1(x)
        x = self.relu(x)
        x = self.pool(x)
        x = self.conv2(x)
        x = self.relu(x)
        x = self.pool(x)
        x = x.view(x.size(0), -1)  # 展平
        x = self.fc1(x)
        x = self.relu(x)
        x = self.fc2(x)
        return x

# 模型初始化
model = SimpleCNN()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=learning_rate)

# 训练模型
for epoch in range(num_epochs):
    model.train()
    for batch_idx, (data, target) in enumerate(train_loader):
        optimizer.zero_grad()
        output = model(data)
        loss = criterion(output, target)
        loss.backward()
        optimizer.step()

        if batch_idx % 100 == 0:
            print(f"Epoch [{epoch+1}/{num_epochs}], Step [{batch_idx}/{len(train_loader)}], Loss: {loss.item():.4f}")

# 测试模型
model.eval()
correct = 0
total = 0
with torch.no_grad():
    for data, target in test_loader:
        output = model(data)
        _, predicted = torch.max(output, 1)
        total += target.size(0)
        correct += (predicted == target).sum().item()

print(f"Accuracy of the model on the test set: {100 * correct / total:.2f}%")


http://www.kler.cn/a/398490.html

相关文章:

  • 麒麟V10,arm64,离线安装docker和docker-compose
  • CPU执行指令的过程
  • LlamaIndex+本地部署InternLM实践
  • ubuntu 安装kafka-eagle
  • Cuda和Pytorch的兼容性
  • 《生成式 AI》课程 第3講 CODE TASK 任务3:自定义任务的机器人
  • C++中的适配器模式
  • Prometheus面试内容整理-Prometheus 的架构和工作原理
  • 【第五课】Rust所有权系统(一)
  • React教程第二节之虚拟DOM与Diffing算法理解
  • 【网络】什么是路由器 (Router )网关设备(Gateway)?
  • 【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
  • 【java】链表:遍历一遍找到mid node
  • Spring Boot框架在电商领域的应用
  • 蓝队基础1 -- 企业信息架构与安全基础
  • 【SQL】mysql常用命令
  • 游戏引擎学习第16天
  • ArcGIS的汉字(亚洲文本)垂直标注
  • 使用Web Accessibility技术提升网站的可达性和用户体验
  • TableGPT2-7B:用于表格数据分析的大规模解码器模型
  • 如何从docker-hub下载镜像
  • 【priority_queue的使用及模拟实现】—— 我与C++的不解之缘(十六)
  • 题目讲解17 判断链表中是否有环
  • BigQuery中jobUser和dataViewer的角色有什么不同
  • C++ 内联函数
  • 006.精读《Apache Paimon Docs - Concepts》