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

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

综述由AI生成Python AI 开发涉及环境配置、模型构建及训练流程。涵盖 PyTorch 安装、线性回归实现、神经网络原理及 MNIST 图像分类实战。针对 Rust 开发者提供了跨语言视角的对比与建议,帮助快速掌握动态类型下的 AI 开发模式与性能权衡。

漫步发布于 2026/3/28更新于 2026/6/116 浏览

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

环境搭建与 Hello World

做 AI 开发,环境是第一步。PyTorch 是目前最主流的选择之一,安装时直接通过 pip 拉取即可。

# 安装 PyTorch 及常用依赖
pip install torch torchvision numpy matplotlib

准备好环境后,我们写一个最简单的 AI 程序——线性回归。这能帮你快速理解模型训练的基本流程:定义数据、构建模型、计算损失、反向传播。

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

# 生成简单的线性训练数据
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 in range(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()
()
# 清零梯度
# 反向传播
# 更新参数
if
1
10
0
print
f'Epoch [{epoch+1}/{epochs}], Loss: {loss.item():.4f}'
# 测试并可视化
with
'Original data'
'r-'
'Fitted line'
print
"Hello World! AI 模型训练完成"

这里有个细节要注意:optimizer.zero_grad() 必须在每次反向传播前调用,否则梯度会累积导致数值爆炸。

从线性回归到神经网络

线性模型只能处理直线关系,现实中的数据往往是非线性的。这时候就需要引入神经网络。

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

# 生成非线性数据(抛物线)
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))  # 激活函数引入非线性
        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()

神经网络的原理其实不难理解:输入层接收数据,隐藏层提取特征,输出层给出预测,而激活函数则是让网络具备拟合复杂模式的关键。

图像分类实战:MNIST

接下来进入真正的计算机视觉领域。我们将使用经典的 MNIST 手写数字数据集。

数据准备
import torch
import torchvision
import torchvision.transforms as transforms

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

# 加载数据集
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)))
构建卷积神经网络 (CNN)

对于图像任务,全连接网络效率太低,我们需要用卷积层来提取空间特征。

import torch.nn as nn
import torch.nn.functional as F

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        # 卷积层
        self.conv1 = nn.Conv2d(1, 32, 3, 1)
        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)
训练与测试
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 开发者视角的思考

如果你是从 Rust 转过来的,可能会觉得 Python 的 AI 开发体验很不一样。

  • 开发效率:Python 在 AI 领域的生态极其丰富,PyTorch 等库封装得很好,写起来比 Rust 快得多。
  • 性能权衡:虽然 Python 运行慢,但底层算子通常由 C++/CUDA 优化,实际推理和训练速度并不差。
  • 类型系统:动态类型意味着少了编译期的检查,但也带来了灵活性。建议保持清晰的代码风格,利用注释弥补类型信息的缺失。

学习建议:利用你在系统编程上的思维优势去理解模型底层,同时注重 Python 的代码可维护性。跨语言结合往往是发挥最大价值的途径。

总结

从线性回归到 CNN 图像分类,我们走完了 Python AI 的基础路径。挑战在于适应动态类型的思维方式,机遇则在于庞大的生态带来的高效率。掌握这些基础后,你可以进一步探索更复杂的模型架构。

目录

  1. Python AI 入门实战:从线性回归到图像分类
  2. 环境搭建与 Hello World
  3. 安装 PyTorch 及常用依赖
  4. 生成简单的线性训练数据
  5. 定义一个简单的线性模型
  6. 实例化模型、损失函数和优化器
  7. 开始训练
  8. 测试并可视化
  9. 从线性回归到神经网络
  10. 生成非线性数据(抛物线)
  11. 定义包含隐藏层的神经网络
  12. 可视化结果
  13. 图像分类实战:MNIST
  14. 数据准备
  15. 数据预处理:转 Tensor 并归一化
  16. 加载数据集
  17. 辅助函数:显示图像
  18. 获取一批数据并显示
  19. 构建卷积神经网络 (CNN)
  20. 训练与测试
  21. 交叉熵损失适合多分类问题
  22. 训练循环
  23. 测试准确率
  24. 查看预测效果
  25. Rust 开发者视角的思考
  26. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Win10 升级后频繁弹出 Copilot 窗口?彻底禁用与关闭方法
  • Python 网页数据爬取实战教程
  • OpenClaw Windows 10 本地 AI 智能体一键部署教程
  • Prompt 驱动的结构化抽取:从文本中提取表格
  • SuperMerger 模型融合实战:权重控制与 MBW 详解
Python 实现 MCP 客户端调用高德地图天气查询示例
  • LLM 大模型训练优化策略详解:数据并行、模型并行与 ZeRO
  • Whisper 与讯飞语音识别方案对比及 Python 实现
  • R语言在AIGC时代的数据科学应用与优势
  • MultiResUNet:重新思考多模态生物医学图像分割的 U-Net 架构
  • LeetCode 692. 前 K 个高频单词 Python 实现
  • MySQL 5.7 彻底卸载与重装全流程及常见问题解决
  • Qwen-Image-2512 V2 版:真实感 AI 绘画模型 ComfyUI 与 WebUI 使用指南
  • 网络安全工作者的黑客精神与行业生态价值
  • Stable Diffusion 修复 Midjourney 生成图片的手部与面部瑕疵
  • 纯 QWidget 实现电子地图控件:多线程瓦片加载与图形覆盖
  • OpenWrt 固件编译:从环境搭建到多架构适配
  • Flutter 集成 google_generative_language_api 适配鸿蒙 HarmonyOS
  • Neo4j 图数据库安装与 Cypher 查询实战指南
  • 零基础本地部署 Stable Diffusion 完整实战指南
  • 相关免费在线工具

    • 加密/解密文本

      使用加密算法(如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