Python AI入门从Hello World到图像分类一、Python AI的Hello World1.1 环境搭建首先我们需要搭建Python AI的开发环境# 安装PyTorchpipinstalltorch torchvision# 安装其他依赖pipinstallnumpy matplotlib1.2 第一个AI程序让我们来编写一个最简单的AI程序 - 线性回归importtorchimporttorch.nnasnnimportnumpyasnpimportmatplotlib.pyplotasplt# 生成训练数据xtorch.linspace(0,10,100).unsqueeze(1)y2*x1torch.randn(100,1)*0.5# 定义模型classLinearModel(nn.Module):def__init__(self):super(LinearModel,self).__init__()self.linearnn.Linear(1,1)defforward(self,x):returnself.linear(x)# 创建模型实例modelLinearModel()# 定义损失函数和优化器criterionnn.MSELoss()optimizertorch.optim.SGD(model.parameters(),lr0.01)# 训练模型epochs100forepochinrange(epochs):# 前向传播outputsmodel(x)# 计算损失losscriterion(outputs,y)# 反向传播optimizer.zero_grad()loss.backward()# 更新参数optimizer.step()if(epoch1)%100:print(fEpoch [{epoch1}/{epochs}], Loss:{loss.item():.4f})# 测试模型withtorch.no_grad():predictedmodel(x)# 可视化结果plt.scatter(x.numpy(),y.numpy(),labelOriginal data)plt.plot(x.numpy(),predicted.numpy(),r-,labelFitted line)plt.legend()plt.show()print(Hello World! AI模型训练完成)二、从线性回归到神经网络2.1 神经网络基础线性回归是最简单的AI模型而神经网络则是更复杂的模型。让我们来构建一个简单的神经网络importtorchimporttorch.nnasnnimporttorch.optimasoptim# 生成非线性数据xtorch.linspace(-1,1,100).unsqueeze(1)yx.pow(2)0.2*torch.randn(100,1)# 定义神经网络模型classNeuralNet(nn.Module):def__init__(self):super(NeuralNet,self).__init__()self.hiddennn.Linear(1,10)self.outputnn.Linear(10,1)defforward(self,x):xtorch.relu(self.hidden(x))xself.output(x)returnx# 创建模型实例modelNeuralNet()# 定义损失函数和优化器criterionnn.MSELoss()optimizeroptim.SGD(model.parameters(),lr0.01)# 训练模型epochs1000forepochinrange(epochs):outputsmodel(x)losscriterion(outputs,y)optimizer.zero_grad()loss.backward()optimizer.step()if(epoch1)%1000:print(fEpoch [{epoch1}/{epochs}], Loss:{loss.item():.4f})# 测试模型withtorch.no_grad():predictedmodel(x)# 可视化结果importmatplotlib.pyplotasplt plt.scatter(x.numpy(),y.numpy(),labelOriginal data)plt.plot(x.numpy(),predicted.numpy(),r-,labelNeural network prediction)plt.legend()plt.show()2.2 理解神经网络的工作原理神经网络的基本原理是通过多层神经元的组合学习数据中的复杂模式输入层接收原始数据隐藏层提取数据特征输出层产生预测结果激活函数引入非线性使网络能够学习复杂模式三、图像分类入门3.1 数据准备我们将使用MNIST数据集进行图像分类importtorchimporttorchvisionimporttorchvision.transformsastransforms# 数据预处理transformtransforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5,),(0.5,))])# 加载MNIST数据集trainsettorchvision.datasets.MNIST(root./data,trainTrue,downloadTrue,transformtransform)trainloadertorch.utils.data.DataLoader(trainset,batch_size64,shuffleTrue)testsettorchvision.datasets.MNIST(root./data,trainFalse,downloadTrue,transformtransform)testloadertorch.utils.data.DataLoader(testset,batch_size64,shuffleFalse)# 查看数据importmatplotlib.pyplotaspltimportnumpyasnp# 函数显示图像defimshow(img):imgimg/20.5# 反归一化npimgimg.numpy()plt.imshow(np.transpose(npimg,(1,2,0)))plt.show()# 获取一批训练数据dataiteriter(trainloader)images,labelsnext(dataiter)# 显示图像imshow(torchvision.utils.make_grid(images))print(标签:, .join(f{labels[j]}forjinrange(4)))3.2 构建图像分类模型现在我们来构建一个用于图像分类的卷积神经网络importtorch.nnasnnimporttorch.nn.functionalasFclassNet(nn.Module):def__init__(self):super(Net,self).__init__()# 卷积层self.conv1nn.Conv2d(1,32,3,1)self.conv2nn.Conv2d(32,64,3,1)# 池化层self.poolnn.MaxPool2d(2,2)# 全连接层self.fc1nn.Linear(64*12*12,128)self.fc2nn.Linear(128,10)defforward(self,x):xself.pool(F.relu(self.conv1(x)))xself.pool(F.relu(self.conv2(x)))xx.view(-1,64*12*12)xF.relu(self.fc1(x))xself.fc2(x)returnx# 创建模型实例netNet()print(net)3.3 训练图像分类模型importtorch.optimasoptim# 定义损失函数和优化器criterionnn.CrossEntropyLoss()optimizeroptim.SGD(net.parameters(),lr0.001,momentum0.9)# 训练模型epochs5forepochinrange(epochs):running_loss0.0fori,datainenumerate(trainloader,0):# 获取输入inputs,labelsdata# 清零梯度optimizer.zero_grad()# 前向传播outputsnet(inputs)# 计算损失losscriterion(outputs,labels)# 反向传播loss.backward()# 更新参数optimizer.step()# 统计损失running_lossloss.item()ifi%10099:print(f[{epoch1},{i1}] loss:{running_loss/100:.3f})running_loss0.0print(训练完成)3.4 测试模型# 测试模型correct0total0withtorch.no_grad():fordataintestloader:images,labelsdata outputsnet(images)_,predictedtorch.max(outputs.data,1)totallabels.size(0)correct(predictedlabels).sum().item()print(f测试准确率:{100*correct/total:.2f}%)# 查看预测结果dataiteriter(testloader)images,labelsnext(dataiter)# 显示图像imshow(torchvision.utils.make_grid(images))print(真实标签:, .join(f{labels[j]}forjinrange(4)))# 预测outputsnet(images)_,predictedtorch.max(outputs,1)print(预测标签:, .join(f{predicted[j]}forjinrange(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模型。
Python AI入门:从Hello World到图像分类
Python AI入门从Hello World到图像分类一、Python AI的Hello World1.1 环境搭建首先我们需要搭建Python AI的开发环境# 安装PyTorchpipinstalltorch torchvision# 安装其他依赖pipinstallnumpy matplotlib1.2 第一个AI程序让我们来编写一个最简单的AI程序 - 线性回归importtorchimporttorch.nnasnnimportnumpyasnpimportmatplotlib.pyplotasplt# 生成训练数据xtorch.linspace(0,10,100).unsqueeze(1)y2*x1torch.randn(100,1)*0.5# 定义模型classLinearModel(nn.Module):def__init__(self):super(LinearModel,self).__init__()self.linearnn.Linear(1,1)defforward(self,x):returnself.linear(x)# 创建模型实例modelLinearModel()# 定义损失函数和优化器criterionnn.MSELoss()optimizertorch.optim.SGD(model.parameters(),lr0.01)# 训练模型epochs100forepochinrange(epochs):# 前向传播outputsmodel(x)# 计算损失losscriterion(outputs,y)# 反向传播optimizer.zero_grad()loss.backward()# 更新参数optimizer.step()if(epoch1)%100:print(fEpoch [{epoch1}/{epochs}], Loss:{loss.item():.4f})# 测试模型withtorch.no_grad():predictedmodel(x)# 可视化结果plt.scatter(x.numpy(),y.numpy(),labelOriginal data)plt.plot(x.numpy(),predicted.numpy(),r-,labelFitted line)plt.legend()plt.show()print(Hello World! AI模型训练完成)二、从线性回归到神经网络2.1 神经网络基础线性回归是最简单的AI模型而神经网络则是更复杂的模型。让我们来构建一个简单的神经网络importtorchimporttorch.nnasnnimporttorch.optimasoptim# 生成非线性数据xtorch.linspace(-1,1,100).unsqueeze(1)yx.pow(2)0.2*torch.randn(100,1)# 定义神经网络模型classNeuralNet(nn.Module):def__init__(self):super(NeuralNet,self).__init__()self.hiddennn.Linear(1,10)self.outputnn.Linear(10,1)defforward(self,x):xtorch.relu(self.hidden(x))xself.output(x)returnx# 创建模型实例modelNeuralNet()# 定义损失函数和优化器criterionnn.MSELoss()optimizeroptim.SGD(model.parameters(),lr0.01)# 训练模型epochs1000forepochinrange(epochs):outputsmodel(x)losscriterion(outputs,y)optimizer.zero_grad()loss.backward()optimizer.step()if(epoch1)%1000:print(fEpoch [{epoch1}/{epochs}], Loss:{loss.item():.4f})# 测试模型withtorch.no_grad():predictedmodel(x)# 可视化结果importmatplotlib.pyplotasplt plt.scatter(x.numpy(),y.numpy(),labelOriginal data)plt.plot(x.numpy(),predicted.numpy(),r-,labelNeural network prediction)plt.legend()plt.show()2.2 理解神经网络的工作原理神经网络的基本原理是通过多层神经元的组合学习数据中的复杂模式输入层接收原始数据隐藏层提取数据特征输出层产生预测结果激活函数引入非线性使网络能够学习复杂模式三、图像分类入门3.1 数据准备我们将使用MNIST数据集进行图像分类importtorchimporttorchvisionimporttorchvision.transformsastransforms# 数据预处理transformtransforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5,),(0.5,))])# 加载MNIST数据集trainsettorchvision.datasets.MNIST(root./data,trainTrue,downloadTrue,transformtransform)trainloadertorch.utils.data.DataLoader(trainset,batch_size64,shuffleTrue)testsettorchvision.datasets.MNIST(root./data,trainFalse,downloadTrue,transformtransform)testloadertorch.utils.data.DataLoader(testset,batch_size64,shuffleFalse)# 查看数据importmatplotlib.pyplotaspltimportnumpyasnp# 函数显示图像defimshow(img):imgimg/20.5# 反归一化npimgimg.numpy()plt.imshow(np.transpose(npimg,(1,2,0)))plt.show()# 获取一批训练数据dataiteriter(trainloader)images,labelsnext(dataiter)# 显示图像imshow(torchvision.utils.make_grid(images))print(标签:, .join(f{labels[j]}forjinrange(4)))3.2 构建图像分类模型现在我们来构建一个用于图像分类的卷积神经网络importtorch.nnasnnimporttorch.nn.functionalasFclassNet(nn.Module):def__init__(self):super(Net,self).__init__()# 卷积层self.conv1nn.Conv2d(1,32,3,1)self.conv2nn.Conv2d(32,64,3,1)# 池化层self.poolnn.MaxPool2d(2,2)# 全连接层self.fc1nn.Linear(64*12*12,128)self.fc2nn.Linear(128,10)defforward(self,x):xself.pool(F.relu(self.conv1(x)))xself.pool(F.relu(self.conv2(x)))xx.view(-1,64*12*12)xF.relu(self.fc1(x))xself.fc2(x)returnx# 创建模型实例netNet()print(net)3.3 训练图像分类模型importtorch.optimasoptim# 定义损失函数和优化器criterionnn.CrossEntropyLoss()optimizeroptim.SGD(net.parameters(),lr0.001,momentum0.9)# 训练模型epochs5forepochinrange(epochs):running_loss0.0fori,datainenumerate(trainloader,0):# 获取输入inputs,labelsdata# 清零梯度optimizer.zero_grad()# 前向传播outputsnet(inputs)# 计算损失losscriterion(outputs,labels)# 反向传播loss.backward()# 更新参数optimizer.step()# 统计损失running_lossloss.item()ifi%10099:print(f[{epoch1},{i1}] loss:{running_loss/100:.3f})running_loss0.0print(训练完成)3.4 测试模型# 测试模型correct0total0withtorch.no_grad():fordataintestloader:images,labelsdata outputsnet(images)_,predictedtorch.max(outputs.data,1)totallabels.size(0)correct(predictedlabels).sum().item()print(f测试准确率:{100*correct/total:.2f}%)# 查看预测结果dataiteriter(testloader)images,labelsnext(dataiter)# 显示图像imshow(torchvision.utils.make_grid(images))print(真实标签:, .join(f{labels[j]}forjinrange(4)))# 预测outputsnet(images)_,predictedtorch.max(outputs,1)print(预测标签:, .join(f{predicted[j]}forjinrange(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模型。