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

C++学习之旅【实战全面解析C++二叉搜索树】

C++学习之旅【实战全面解析C++二叉搜索树】

🔥承渊政道:个人主页 ❄️个人专栏: 《C语言基础语法知识》《数据结构与算法》 《C++知识内容》《Linux系统知识》 ✨逆境不吐心中苦,顺境不忘来时路!🎬 博主简介: 引言:前篇文章,小编已经介绍了关于C++中多态概念指南与核心内容介绍!相信大家应该有所收获!接下来我将带领大家继续深入学习C++的相关内容!本篇文章着重介绍关于实战全面解析C++二叉搜索树,那么这里面到底有哪些知识需要我们去学习的呢?废话不多说,带着这些疑问,下面跟着小编的节奏🎵一起学习吧! 目录 * 1.⼆叉搜索树的概念 * 2.⼆叉搜索树的性能分析 * 3.⼆叉搜索树的插⼊ * 4.⼆叉搜索树的查找 * 5.⼆叉搜索树的删除 * 6.⼆叉搜索树的实现代码 * 7.⼆叉搜索树key和key/value使⽤场景 * 7.1key搜索场景 * 7.2key/value搜索场景 * 7.3key/value⼆

By Ne0inhk
基于C++的DPU医疗领域编程初探

基于C++的DPU医疗领域编程初探

一、大型医院数据处理困境与 DPU 的崛起 在数字化浪潮的席卷下,医疗行业正经历着深刻变革,大型医院作为医疗服务的核心枢纽,积累了海量的数据,涵盖患者的基本信息、诊断记录、检验报告、影像资料等多个维度。这些数据不仅规模庞大,而且增长速度迅猛,传统的中央处理器(CPU)在处理如此大规模且复杂的数据时,逐渐暴露出性能瓶颈。 以医疗影像处理为例,CT、MRI 等影像数据量巨大,一幅高分辨率的 CT 影像数据量可达数百 MB 甚至更多,常规 CPU 处理这样一幅影像可能需要数分钟,这在争分夺秒的医疗场景中,极大地影响了诊断效率。在患者数据管理方面,随着患者数量的增加和数据维度的丰富,对数据的存储、查询和分析也提出了更高的要求,传统 CPU 处理方式难以满足实时性和高效性的需求。 为了解决这些问题,数据处理单元(DPU)应运而生。DPU 是一种专门为数据处理而设计的硬件设备,具备强大的并行计算能力和高效的数据处理性能。它能够将数据处理任务从 CPU 中卸载出来,实现数据的快速处理和分析。

By Ne0inhk
深入解剖STL set/multiset:接口使用与核心特性详解

深入解剖STL set/multiset:接口使用与核心特性详解

❤️@燃于AC之乐 来自重庆 计算机专业的一枚大学生 ✨专注 C/C++ Linux 数据结构 算法竞赛 AI 🏞️志同道合的人会看见同一片风景! 👇点击进入作者专栏: 《算法画解》 ✅ 《linux系统编程》✅ 《C++》 ✅ 🌟《算法画解》算法相关题目点击即可进入实操🌟 感兴趣的可以先收藏起来,请多多支持,还有大家有相关问题都可以给我留言咨询,希望希望共同交流心得,一起进步,你我陪伴,学习路上不孤单! 文章目录 * 前言(关联式容器概述) * 一、set类介绍 * 1.1 set的类模板声明 * 二、set的构造与迭代器 * 2.1 构造接口 * 2.2 迭代器接口 * 三、set的核心操作接口 * 3.1 插入操作 * 3.2 查找操作 * 3.3

By Ne0inhk
[Java]RuoYi框架原理分析

[Java]RuoYi框架原理分析

代码生成器 源码分析 代码生成器是提高开发效率的重要工具,它主要分为两个部分: 第一部分涉及将业务表结构导入到系统中,在这里,开发者可以预览、编辑、删除和同步业务表结构,实现对业务表的全面管理。 第二部分是在选择了特定的表之后,点击生成按钮,系统将根据表结构生成相应的前后端代码,并提供下载。 表结构说明 若依提供了两张核心表来存储导入的业务表信息: gen_table:存储业务表的基本信息 ,它对应于配置代码基本信息和生成信息的页面 gen_table_column:存储业务表的字段信息 它对应于配置代码字段信息的页面。 这两张表是一对多的关系,一张业务表可以有多个字段的信息,所以在字段信息表中有个外键table_id指向 目录结构 1)后端代码 2)前端代码 查询数据库列表 当管理员在界面上点击导入按钮时,会弹出一个对话框,此时,前端需要向后端发送请求,查询数据库并返回到前端,展示当前项目库中所有待导入的业务表。 此功能涉及前端相关的代码位于views/tool/index.vue这个视图组件中,负责实现导入业务表的用

By Ne0inhk