Python AI入门:从Hello World到图像分类

Python AI入门:从Hello World到图像分类

一、Python AI的Hello World

1.1 环境搭建

首先,我们需要搭建Python AI的开发环境:

# 安装PyTorch pip install torch torchvision # 安装其他依赖 pip install numpy matplotlib 

1.2 第一个AI程序

让我们来编写一个最简单的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# 定义模型classLinearModel(nn.Module):def__init__(self):super(LinearModel, self).__init__() self.linear = nn.Linear(1,1)defforward(self, x):return self.linear(x)# 创建模型实例 model = LinearModel()# 定义损失函数和优化器 criterion = nn.MSELoss() optimizer = torch.optim.SGD(model.parameters(), lr=0.01)# 训练模型 epochs =100for epoch inrange(epochs):# 前向传播 outputs = model(x)# 计算损失 loss = criterion(outputs, y)# 反向传播 optimizer.zero_grad() loss.backward()# 更新参数 optimizer.step()if(epoch +1)%10==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='Fitted line') plt.legend() plt.show()print("Hello World! AI模型训练完成")

二、从线性回归到神经网络

2.1 神经网络基础

线性回归是最简单的AI模型,而神经网络则是更复杂的模型。让我们来构建一个简单的神经网络:

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)# 定义神经网络模型classNeuralNet(nn.Module):def__init__(self):super(NeuralNet, self).__init__() self.hidden = nn.Linear(1,10) self.output = nn.Linear(10,1)defforward(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 =1000for epoch inrange(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)# 可视化结果import matplotlib.pyplot as plt plt.scatter(x.numpy(), y.numpy(), label='Original data') plt.plot(x.numpy(), predicted.numpy(),'r-', label='Neural network prediction') plt.legend() plt.show()

2.2 理解神经网络的工作原理

神经网络的基本原理是通过多层神经元的组合,学习数据中的复杂模式:

  1. 输入层:接收原始数据
  2. 隐藏层:提取数据特征
  3. 输出层:产生预测结果
  4. 激活函数:引入非线性,使网络能够学习复杂模式

三、图像分类入门

3.1 数据准备

我们将使用MNIST数据集进行图像分类:

import torch import torchvision import torchvision.transforms as transforms # 数据预处理 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)# 查看数据import matplotlib.pyplot as plt import numpy as np # 函数:显示图像defimshow(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 inrange(4)))

3.2 构建图像分类模型

现在我们来构建一个用于图像分类的卷积神经网络:

import torch.nn as nn import torch.nn.functional as F classNet(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)defforward(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.3 训练图像分类模型

import torch.optim as optim # 定义损失函数和优化器 criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)# 训练模型 epochs =5for epoch inrange(epochs): running_loss =0.0for i, data inenumerate(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.0print('训练完成')

3.4 测试模型

# 测试模型 correct =0 total =0with 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 inrange(4)))# 预测 outputs = net(images) _, predicted = torch.max(outputs,1)print('预测标签:',' '.join(f'{predicted[j]}'for j inrange(4)))

四、从Rust开发者角度的思考

4.1 与Rust的对比

作为一个Rust开发者,学习Python AI有以下感受:

  • 开发效率:Python的开发效率比Rust高,尤其是在AI开发中
  • 生态系统:Python的AI生态系统非常丰富,有大量成熟的库
  • 性能:Python的性能虽然不如Rust,但在AI开发中,PyTorch等库已经做了很多优化
  • 类型系统:Python的动态类型与Rust的静态类型有很大不同,需要适应

4.2 学习建议

对于Rust开发者学习Python AI,我有以下建议:

  • 利用系统思维:Rust的系统级编程经验有助于理解AI模型的底层实现
  • 注重代码质量:保持Rust的代码风格,写出清晰、可维护的Python代码
  • 实践项目:通过实际项目巩固学习成果
  • 跨语言学习:将Rust和Python结合起来,发挥各自的优势

五、总结

通过从Hello World到图像分类的学习,我已经初步掌握了Python AI的基本概念和使用方法。作为一个Rust开发者,我发现Python AI的学习过程既有挑战也有机遇。

挑战在于Python的动态类型和内存管理与Rust有很大不同,需要适应新的思维方式。机遇在于Python的AI生态系统非常丰富,开发效率高,能够快速实现AI模型。

Read more

React Native智能家居摄像头模块深度解析:直播、回放与告警的技术实现

在智能家居应用开发中,摄像头模块往往是功能最复杂、技术挑战最大的部分之一。本文将通过深入分析三个核心文件:CameraHome.js(实时直播)、CameraRecordNew.js(录像回放)和EventAlarmPageNew.js(事件告警),揭示一个成熟智能家居摄像头模块的技术架构与实现细节。 一、CameraHome.js - 摄像头直播控制中心 1. 主要功能全景 CameraHome.js作为摄像头的主控制界面,实现了全方位的设备管理功能: * 实时视频流处理:支持高清/标清双流切换、播放控制(播放/暂停/停止) * 高级云台控制:8方向转动、边界智能检测、6个预设视角管理 * 音视频交互:双向语音通话、麦克风与扬声器控制 * 智能场景模式:夜视模式、隐私模式、遮蔽模式一键切换 * 多存储状态监控:实时显示SD卡、云存储、NAS的使用状态 * 告警即时预览:今日告警数量统计、最新告警事件展示 2.

GLM-4-9B-Chat-1M环境部署:Transformers/vLLM/llama.cpp三推理框架对比选型

GLM-4-9B-Chat-1M环境部署:Transformers/vLLM/llama.cpp三推理框架对比选型 想象一下,你手头有一份300页的PDF合同,或者一整年的公司财报,你想让AI帮你快速总结要点、提取关键信息,甚至回答基于这份长文档的复杂问题。过去,这几乎不可能——模型要么读不完,要么读完就“失忆”,要么需要昂贵的多卡集群。 现在,情况变了。智谱AI开源的GLM-4-9B-Chat-1M模型,直接把上下文长度拉到了惊人的100万token,相当于一次性能读完200万汉字。更关键的是,它只需要一张24GB显存的消费级显卡(比如RTX 3090/4090)就能跑起来。 模型有了,怎么把它用起来?这就是我们今天要解决的问题。市面上主流的推理框架有好几个:Transformers、vLLM、llama.cpp,它们各有各的脾气和特长。选错了,你可能面对的是缓慢的推理速度、爆满的显存,或者复杂的部署流程。 这篇文章,我就带你亲手部署GLM-4-9B-Chat-1M,并横向对比这三个框架。我会告诉你,在什么硬件条件下,为了什么目的,应该选哪一个。目标很简单:让你用最少的折腾,

信号处理仿真:图像信号处理_(10).图像信号处理的硬件实现

信号处理仿真:图像信号处理_(10).图像信号处理的硬件实现

图像信号处理的硬件实现 在图像信号处理领域,硬件实现是将图像处理算法转换为物理设备的关键步骤。硬件实现可以显著提高处理速度和效率,特别是在实时处理和大规模数据处理中。本节将详细探讨图像信号处理的硬件实现原理和技术,包括常见的硬件平台、设计流程、性能优化方法等。 常见的硬件平台 1. FPGA(Field-Programmable Gate Array) FPGA 是一种可编程逻辑器件,可以在用户定义的硬件设计中实现复杂的数字逻辑功能。FPGA 的主要优点是并行处理能力和低延迟,适用于实时图像处理任务。 原理 FPGA 通过硬件描述语言(如 VHDL 或 Verilog)设计逻辑功能。用户可以在 FPGA 上实现自定义的数字信号处理算法,这些算法可以直接映射到硬件资源,从而实现高效的并行处理。 设计流程 1. 需求分析:确定图像处理任务的具体需求,包括输入输出格式、处理速度、资源限制等。 2. 算法设计:选择合适的图像处理算法,并进行数学建模。 3. 硬件描述:使用 VHDL 或

基于STM32的智能家居安防系统毕设:效率提升的软硬件协同优化实践

最近在做一个基于STM32的智能家居安防系统毕设,从立项到调通,整个过程踩了不少坑,也收获了很多。今天想和大家聊聊这个项目里最核心的一个话题:效率提升。在资源有限的STM32上,既要实时监控多个传感器,又要快速响应报警,还要兼顾低功耗,这可不是一件容易的事。下面我就把自己在软硬件协同优化上的一些实践和思考记录下来,希望能给有类似需求的同学一些参考。 1. 背景痛点:轮询架构的“力不从心” 最开始做方案设计时,我采用了最直观的“轮询”方式:在主循环里依次读取各个传感器(比如门磁、红外、烟雾)的状态。代码写起来简单,但问题很快就暴露了。 * CPU被“绑架”:主循环大部分时间都在空转,等待传感器响应或进行无意义的读取,CPU利用率居高不下,却做了很多无用功。 * 响应“慢半拍”:假设主循环一次需要50ms,那么一个紧急的门窗入侵信号,在最坏情况下需要等50ms才能被处理,这对于安防系统来说是不可接受的延迟。 * 功耗“下不来”:CPU一直在全速运行,无法进入低功耗模式,对于需要电池供电或长期待机的场景非常不友好。 这让我意识到,在传感器密集的安防场景下,传统的轮询架构是效率提