源码先锋

源码先锋

PyTorch高效入门到应用:概念、技巧与线性回归/MLP实例

admin 160 95

本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程,并实现线性回归与多层感知机模型。

一、Tensor:PyTorch的核心数据结构1.1张量创建与基础操作
importtorch标量(0维)vector=([1,2,3])矩阵(2维)tensor_3d=(2,3,4)基础运算a=([1,2,3])b=([4,5,6])print("加法:",a+b)逐元素乘法print("点积:",(a,b))矩阵乘法视图(不复制数据)cloned=(3,4)索引操作tensor=([[1,2,3],[4,5,6],[7,8,9]])print("第一行:",tensor[0])[3,6,9]print("子矩阵:\n",tensor[1:,:2])广播机制A=([[1,2],[3,4]])B=([10,20])创建需要梯度的张量x=(2.0,requires_grad=True)y=(3.0,requires_grad=True)反向传播计算梯度()print(f"dz/dx={}")3y²=27
2.2复杂函数梯度
[3,8]d=()*2[6,8]print("b的梯度:",)第一次计算y1=x**2()print("第一次梯度:",)第二次计算(梯度累积)y2=x**3()print("累积梯度:",)梯度清零_()y3=2*()print("清零后梯度:",)3个特征=[:,0]*2+[:,1]*3-[:,2]*1.5def__len__(self):returnlen()def__getitem__(self,idx):features=([idx],dtype=)target=([idx],dtype=)returnfeatures,target可视化数据分布(figsize=(12,4))(131)([:,0],)('特征1vs目标值')(132)([:,1],)('特征2vs目标值')(133)([:,2],)('特征3vs目标值')_layout()()
3.2DataLoader使用
迭代获取批次数据forbatch_idx,(inputs,targets)inenumerate(dataloader):print(f"批次{batch_idx}:")print(f"输入形状:{}")print(f"目标形状:{}")实例化模型model=LinearRegression(input_dim=3)print("模型结构:\n",model)创建MLP模型mlp=MLP(input_size=3,hidden_size=16,output_size=1)print("MLP结构:\n",mlp)

五、训练流程:完整训练循环5.1训练框架代码
均方误差损失optimizer=((),lr=0.01)批次训练forinputs,targetsindataloader:inputs,targets=(device),(device)反向传播_grad()()()epoch_loss+=()每10轮打印损失if(epoch+1)%10==0:print(f'Epoch[{epoch+1}/{num_epochs}],Loss:{avg_loss:.4f}')切换到评估模式model.eval()计算评估指标mse=criterion(predictions,actuals)mae=((predictions-actuals))print(f'测试集MSE:{():.4f}')print(f'测试集MAE:{():.4f}')生成合成数据X=(0,10,100).reshape(-1,1)y=3*X+2+(100,1)*2训练配置model=LinearReg()optimizer=((),lr=0.1)criterion=()前向传播preds=model(X)loss=criterion(preds,y)可视化训练过程ifepoch%50==0:(X,y,label='原始数据')(X,().numpy(),'r-',lw=3,label='模型预测')(f'Epoch{epoch},Loss:{():.4f}')()()(0.1)()数据预处理transform=([(),((0.1307,),(0.3081,))])创建数据加载器train_loader=DataLoader(train_data,batch_size=64,shuffle=True)test_loader=DataLoader(test_data,batch_size=1000)展平x=((x))x=(x)x=((x))x=(x)returnx测试函数deftest(model,device,test_loader,criterion):model.eval()test_loss=0correct=0_grad():fordata,targetintest_loader:data,target=(device),(device)output=model(data)test_loss+=criterion(output,target).item()pred=(dim=1,keepdim=True)correct+=(_as(pred)).sum().item()test_loss/=len(test_)accuracy=100.*correct/len(test_)print(f'\n测试集:平均损失:{test_loss:.4f},准确率:{correct}/{len(test_)}({accuracy:.2f}%)\n')returnaccuracy绘制准确率曲线(accuracy_history)('MNIST分类准确率')('Epochs')('Accuracy(%)')(True)()

七、关键要点总结Tensor核心操作:
graphTDA[创建张量]--B[基础运算]B--C[形状变换]C--D[索引切片]D--E[广播机制]

自动求导三步骤:

2.前向计算y=x**2+3*x+1导数:2x+3=7

数据加载最佳实践:

自定义Dataset类实现__len__和__getitem__

使用DataLoader进行批次加载和混洗

多进程加速设置num_workers0

模型构建模式:

classCustomModel():def__init__(self):super().__init__()定义数据流向returnoutput

训练循环模板:

forepochinrange(epochs):fordataindataloader:inputs,labels=data反向传播_grad()()()

调试技巧:

使用()检查张量值

print(model)查看网络结构

_detect_anomaly(True)检测梯度异常

如果本次分享对你有所帮助,记得告诉身边有需要的朋友,"我们正在经历的不仅是技术迭代,而是认知革命。当人类智慧与机器智能形成共生关系,文明的火种将在新的维度延续。"在这场波澜壮阔的文明跃迁中,主动拥抱AI时代,就是掌握打开新纪元之门的密钥,让每个人都能在智能化的星辰大海中,找到属于自己的航向。