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 # 定义模型 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() 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模型,而神经网络则是更复杂的模型。
挑战在于Python的动态类型和内存管理与Rust有很大不同,需要适应新的思维方式。
让我们来构建一个简单的神经网络: 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) # 可视化结果 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 理解神经网络的工作原理 神经网络的基本原理是通过多层神经元的组合,学习数据中的复杂模式: 输入层:接收原始数据隐藏层:提取数据特征输出层:产生预测结果激活函数:引入非线性,使网络能够学习复杂模式 三、图像分类入门 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 # 函数:显示图像 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))) 3.2 构建图像分类模型 现在我们来构建一个用于图像分类的卷积神经网络: 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) 3.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('训练完成') 3.4 测试模型 # 测试模型 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开发者角度的思考 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的AI生态系统非常丰富,开发效率高,能够快速实现AI模型。
内容整理自CSDN博客,仅供技术交流参考。
注册
登录控制台
