跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

Python AI 实战:从线性回归到 MNIST 图像分类

Python AI 开发流程涵盖环境搭建、线性回归模型构建、神经网络原理及 MNIST 图像分类实战。通过 PyTorch 框架演示了从基础数据生成到卷积神经网络训练的全过程,对比了动态语言与系统级语言在 AI 开发中的差异,适合希望快速上手深度学习项目的开发者参考。

SecGuard发布于 2026/4/8更新于 2026/10/25112 浏览

Python AI 实战:从线性回归到 MNIST 图像分类

环境搭建与基础准备

在开始之前,确保你的开发环境中已安装 PyTorch 及相关依赖。这通常是进入深度学习领域的第一个门槛。

# 安装 PyTorch 及 torchvision
pip install torch torchvision
# 其他常用科学计算库
pip install numpy matplotlib

从零构建线性回归模型

线性回归是理解机器学习最直观的起点。我们不需要复杂的架构,只需一个能拟合数据的简单模型。

import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt

# 生成训练数据:y = 2x + 1 + noise
x = torch.linspace(0, 10, 100).unsqueeze(1)
y = 2 * x + 1 + torch.randn(100, 1) * 0.5

# 定义简单的线性模型
class LinearModel(nn.Module):
    def __init__(self):
        super(LinearModel, self).__init__()
        self.linear = nn.Linear(1, 1)

    def forward(self, x):
        return self.linear(x)

# 实例化模型、损失函数和优化器
model = LinearModel()
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

# 训练循环
epochs = 100
for epoch  (epochs):
    outputs = model(x)
    loss = criterion(outputs, y)
    
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

     (epoch + ) %  == :
        ()


 torch.no_grad():
    predicted = model(x)

plt.scatter(x.numpy(), y.numpy(), label=)
plt.plot(x.numpy(), predicted.numpy(), , label=)
plt.legend()
plt.show()
()
in
range
if
1
10
0
print
f'Epoch [{epoch+1}/{epochs}], Loss: {loss.item():.4f}'
# 测试与可视化
with
'Original data'
'r-'
'Fitted line'
print
"AI 模型训练完成"

这段代码展示了完整的训练闭环:前向传播计算预测值,通过损失函数评估误差,反向传播更新参数。注意 optimizer.zero_grad() 的作用,它防止梯度累积导致数值爆炸。

进阶:神经网络与非线性拟合

当数据呈现非线性关系时,单层线性模型就力不从心了。我们需要引入隐藏层和激活函数。

import torch
import torch.nn as nn
import torch.optim as optim

# 生成非线性数据:y = x^2 + noise
x = torch.linspace(-1, 1, 100).unsqueeze(1)
y = x.pow(2) + 0.2 * torch.randn(100, 1)

class NeuralNet(nn.Module):
    def __init__(self):
        super(NeuralNet, self).__init__()
        self.hidden = nn.Linear(1, 10)  # 隐藏层
        self.output = nn.Linear(10, 1)  # 输出层

    def forward(self, x):
        x = torch.relu(self.hidden(x))  # ReLU 激活
        x = self.output(x)
        return x

model = NeuralNet()
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)

epochs = 1000
for epoch in range(epochs):
    outputs = model(x)
    loss = criterion(outputs, y)
    
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    if (epoch + 1) % 100 == 0:
        print(f'Epoch [{epoch+1}/{epochs}], Loss: {loss.item():.4f}')

# 可视化结果
with torch.no_grad():
    predicted = model(x)

plt.scatter(x.numpy(), y.numpy(), label='Original data')
plt.plot(x.numpy(), predicted.numpy(), 'r-', label='Neural network prediction')
plt.legend()
plt.show()

这里的关键在于 torch.relu 引入了非线性,使得网络能够拟合曲线而非直线。对于更复杂的数据分布,增加隐藏层或神经元数量通常能提升效果。

图像分类实战:MNIST 数据集

处理图像数据需要卷积神经网络(CNN)。PyTorch 提供了便捷的 torchvision 工具包来加载和处理标准数据集。

1. 数据加载与预处理
import torch
import torchvision
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import numpy as np

# 数据预处理:归一化
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5,), (0.5,))
])

# 加载 MNIST 数据集
trainset = torchvision.datasets.MNIST(root='./data', train=True, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True)
testset = torchvision.datasets.MNIST(root='./data', train=False, download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=64, shuffle=False)

# 辅助函数:显示图像
def imshow(img):
    img = img / 2 + 0.5
    npimg = img.numpy()
    plt.imshow(np.transpose(npimg, (1, 2, 0)))
    plt.show()

# 查看一批训练数据
dataiter = iter(trainloader)
images, labels = next(dataiter)
imshow(torchvision.utils.make_grid(images))
print('标签:', ' '.join(f'{labels[j]}' for j in range(4)))
2. 构建卷积神经网络
import torch.nn as nn
import torch.nn.functional as F

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        # 卷积层:输入通道 1,输出 32,核大小 3
        self.conv1 = nn.Conv2d(1, 32, 3, 1)
        # 卷积层:输入通道 32,输出 64,核大小 3
        self.conv2 = nn.Conv2d(32, 64, 3, 1)
        # 池化层
        self.pool = nn.MaxPool2d(2, 2)
        # 全连接层
        self.fc1 = nn.Linear(64 * 12 * 12, 128)
        self.fc2 = nn.Linear(128, 10)

    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = x.view(-1, 64 * 12 * 12)
        x = F.relu(self.fc1(x))
        x = self.fc2(x)
        return x

net = Net()
print(net)
3. 训练与评估
import torch.optim as optim

# 交叉熵损失适合多分类问题
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

# 训练循环
epochs = 5
for epoch in range(epochs):
    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        inputs, labels = data
        
        optimizer.zero_grad()
        outputs = net(inputs)
        loss = criterion(outputs, labels)
        
        loss.backward()
        optimizer.step()
        
        running_loss += loss.item()
        if i % 100 == 99:
            print(f'[{epoch + 1}, {i + 1}] loss: {running_loss / 100:.3f}')
            running_loss = 0.0

print('训练完成')

# 测试准确率
correct = 0
total = 0
with torch.no_grad():
    for data in testloader:
        images, labels = data
        outputs = net(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print(f'测试准确率:{100 * correct / total:.2f}%')

# 查看预测结果
dataiter = iter(testloader)
images, labels = next(dataiter)
imshow(torchvision.utils.make_grid(images))
print('真实标签:', ' '.join(f'{labels[j]}' for j in range(4)))
outputs = net(images)
_, predicted = torch.max(outputs, 1)
print('预测标签:', ' '.join(f'{predicted[j]}' for j in range(4)))

跨语言视角的思考

对于有系统编程背景(如 Rust)的开发者,转向 Python AI 开发会有不同的体验:

  • 开发效率:Python 的动态特性让原型迭代非常快,无需像 Rust 那样频繁处理生命周期和所有权问题。
  • 生态优势:PyTorch 等框架封装了底层优化,直接调用即可,省去了大量底层实现工作。
  • 性能权衡:虽然 Python 运行速度不如 Rust,但核心计算通常由 C++/CUDA 后端加速,对最终用户透明。
  • 类型系统:动态类型要求更严格的逻辑自洽,建议配合类型注解(Type Hints)提升可维护性。

保持清晰的代码结构,将业务逻辑与底层细节分离,是跨语言迁移时的关键习惯。

总结

从线性回归到 CNN 图像分类,我们完成了 Python AI 开发的核心流程。掌握 PyTorch 的基本组件(Dataset, DataLoader, Module, Optimizer)后,应对大多数入门级深度学习任务已不成问题。在实际项目中,建议结合具体业务场景调整网络结构,并关注数据质量对模型效果的直接影响。

目录

  1. Python AI 实战:从线性回归到 MNIST 图像分类
  2. 环境搭建与基础准备
  3. 安装 PyTorch 及 torchvision
  4. 其他常用科学计算库
  5. 从零构建线性回归模型
  6. 生成训练数据:y = 2x + 1 + noise
  7. 定义简单的线性模型
  8. 实例化模型、损失函数和优化器
  9. 训练循环
  10. 测试与可视化
  11. 进阶:神经网络与非线性拟合
  12. 生成非线性数据:y = x^2 + noise
  13. 可视化结果
  14. 图像分类实战:MNIST 数据集
  15. 1. 数据加载与预处理
  16. 数据预处理:归一化
  17. 加载 MNIST 数据集
  18. 辅助函数:显示图像
  19. 查看一批训练数据
  20. 2. 构建卷积神经网络
  21. 3. 训练与评估
  22. 交叉熵损失适合多分类问题
  23. 训练循环
  24. 测试准确率
  25. 查看预测结果
  26. 跨语言视角的思考
  27. 总结

更多推荐文章

查看全部
  • 内网穿透实战:让本地 OpenClaw 服务随时随地上线
  • SpringBoot 4.0 新特性整合项目实战
  • Pi0机器人大模型在昇腾A2上的测评
  • C++ 从零实现 K-Means 聚类算法详解
  • n8n 开源自动化工作流工具部署与使用指南
  • 在昇腾 NPU 上部署 Llama 大模型实战指南
  • Llama-3.2-3B 部署优化:Ollama 配置上下文窗口与 Token 限制
  • Seedream 4.0 企业级图像 AIGC 能力解析与应用场景
  • AI 绘画精讲与 AIGC 时代游戏美术设计:从入门到精通
  • 常见黑客硬件设备原理与防御指南
  • AI Agent 新范式:FastGPT 结合 MCP 协议实现工具增强
  • Android 中高级技术面试核心考点与解析
  • 人工智能(AI)在教育、科研与行政领域的应用与变革
  • WebStorm 非商业用途全面免费:权益与边界解析
  • 知网维普 AIGC 检测应对策略:降低论文 AI 率的方法
  • 二分算法实战:查找元素首尾位置与区间计数
  • C++ 多态核心原理与实现细节
  • AI、AGI、AIGC、NLP、LLM 与 ChatGPT 的核心区别与联系
  • 为什么 AI 产品经理日渐成为热门职业
  • 自然语言处理基础与文本分析系统开发

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online