PyTorch深度学习实战指南
发布时间:2026/10/1 6:44:13来源:尧图网络
PyTorch 深度学习实战指南深度学习是 CSDN AI 板块流量最大的主题PyTorch 是其中最主流的框架。本文从张量讲起覆盖自动求导、神经网络搭建、训练流程、数据集处理、CNN 实战、GPU 训练、模型保存与部署全程带可运行代码。一、为什么学 PyTorch1.1 PyTorch vs TensorFlow维度PyTorchTensorFlow动态图原生调试友好2.x 支持但心智偏静态上手简单像 NumPy相对复杂社区学术界主流生产部署生态成熟研究论文标配较少部署TorchScript/ONNXTF Serving 成熟现状研究、Kaggle、大模型微调几乎全是 PyTorch 生态HuggingFace 基于 PyTorch。1.2 核心心智模型数据Dataset/DataLoader → 模型nn.Module → 损失函数loss → 优化器optimizer → 训练循环forward → backward → step这个循环贯穿所有深度学习任务。二、张量Tensor基础2.1 创建张量importtorch# 从列表t1torch.tensor([[1,2],[3,4]])# 2x2t2torch.zeros(3,4)# 全 0t3torch.ones(2,3)# 全 1t4torch.randn(5,5)# 正态分布随机t5torch.arange(10)# 0-9t6torch.eye(3)# 单位矩阵# 从 NumPy 互转importnumpyasnp anp.array([1,2,3])ttorch.from_numpy(a)# numpy → tensorbt.numpy()# tensor → numpy注意from_numpy共享内存改一个另一个也变。2.2 基本运算atorch.tensor([1.0,2.0,3.0])btorch.tensor([4.0,5.0,6.0])cab# 加法da*b# 逐元素乘etorch.matmul(a,b)# 矩阵乘法或 fa.mean()# 均值ga.sum()# 求和ha.reshape(3,1)# 变形2.3 张量的形状xtorch.randn(32,3,224,224)# batch32, 通道3, 高224, 宽224x.shape# torch.Size([32, 3, 224, 224])x.ndim# 4x.size(0)# 32batch 维度维度顺序深度学习里图像默认(N, C, H, W)。2.4 设备管理# CPU/GPU 判断devicetorch.device(cudaiftorch.cuda.is_available()elsecpu)print(使用设备:,device)xtorch.randn(100,100).to(device)# 搬到 GPU三、自动求导Autograd3.1 核心机制PyTorch 的杀手锏张量带 requires_gradTrue反向传播自动算梯度。xtorch.tensor(3.0,requires_gradTrue)yx**2# y x²y.backward()# 反向传播print(x.grad)# dy/dx 2x 6.03.2 神经网络中的自动求导wtorch.randn(4,4,requires_gradTrue)# 模型参数losscompute_loss(...)loss.backward()# 所有参数的梯度自动算好print(w.grad)# 每个参数的梯度3.3 关闭梯度推理时# 推理时不需要梯度节省内存加速withtorch.no_grad():outputmodel(x)训练/推理切换model.train()# 训练模式Dropout/BN 生效model.eval()# 推理模式四、搭建神经网络nn.Module4.1 一个简单的模型importtorch.nnasnnclassMLP(nn.Module):def__init__(self,input_size,hidden_size,num_classes):super().__init__()self.fc1nn.Linear(input_size,hidden_size)self.relunn.ReLU()self.fc2nn.Linear(hidden_size,num_classes)defforward(self,x):xself.fc1(x)xself.relu(x)xself.fc2(x)returnx modelMLP(784,128,10)print(model)核心规则继承nn.Module__init__定义层forward定义前向计算反向传播自动处理。4.2 常用层nn.Linear(128,64)# 全连接nn.Conv2d(3,16,3)# 卷积输入通道, 输出通道, 核大小nn.BatchNorm2d(16)# 批归一化nn.ReLU()# 激活nn.Dropout(0.5)# 随机丢弃防过拟合nn.MaxPool2d(2)# 池化nn.Embedding(10000,128)# 词嵌入nn.LSTM(128,64,2)# 循环网络4.3 损失函数与优化器importtorch.optimasoptim# 分类交叉熵criterionnn.CrossEntropyLoss()# 回归MSE# criterion nn.MSELoss()# 优化器SGD / Adam 最常用optimizeroptim.Adam(model.parameters(),lr0.001)Adam vs SGDAdam自适应学习率默认首选收敛快SGD需要调 lr 和动量但泛化可能更好。五、数据集处理5.1 自定义 Datasetfromtorch.utils.dataimportDataset,DataLoaderfromPILimportImageclassCatDogDataset(Dataset):def__init__(self,image_paths,labels,transformNone):self.image_pathsimage_paths self.labelslabels self.transformtransformdef__len__(self):returnlen(self.image_paths)def__getitem__(self,idx):imgImage.open(self.image_paths[idx]).convert(RGB)ifself.transform:imgself.transform(img)returnimg,self.labels[idx]5.2 数据增强transformfromtorchvisionimporttransforms train_transformtransforms.Compose([transforms.Resize((224,224)),transforms.RandomHorizontalFlip(),# 随机翻转增强transforms.RandomRotation(10),# 随机旋转transforms.ToTensor(),# 转张量transforms.Normalize(mean[0.485,0.456,0.406],std[0.229,0.224,0.225])# 标准化])# 测试集不做随机增强只标准化test_transformtransforms.Compose([transforms.Resize((224,224)),transforms.ToTensor(),transforms.Normalize(mean[0.485,0.456,0.406],std[0.229,0.224,0.225])])5.3 DataLoader 批量加载train_loaderDataLoader(train_dataset,batch_size32,shuffleTrue,# 训练要打乱num_workers4# 多进程加载)test_loaderDataLoader(test_dataset,batch_size64,shuffleFalse# 测试不打乱)六、完整训练流程6.1 训练循环模板deftrain_one_epoch(model,train_loader,criterion,optimizer,device):model.train()total_loss,correct,total0,0,0forimages,labelsintrain_loader:images,labelsimages.to(device),labels.to(device)# 1. 清零梯度optimizer.zero_grad()# 2. 前向outputsmodel(images)losscriterion(outputs,labels)# 3. 反向loss.backward()# 4. 更新参数optimizer.step()total_lossloss.item()_,predictedoutputs.max(1)totallabels.size(0)correctpredicted.eq(labels).sum().item()returntotal_loss/len(train_loader),correct/total6.2 评估循环defevaluate(model,test_loader,criterion,device):model.eval()total_loss,correct,total0,0,0withtorch.no_grad():# 推理不计算梯度forimages,labelsintest_loader:images,labelsimages.to(device),labels.to(device)outputsmodel(images)losscriterion(outputs,labels)total_lossloss.item()_,predictedoutputs.max(1)totallabels.size(0)correctpredicted.eq(labels).sum().item()returntotal_loss/len(test_loader),correct/total6.3 主循环EPOCHS20best_acc0forepochinrange(EPOCHS):train_loss,train_acctrain_one_epoch(model,train_loader,criterion,optimizer,device)val_loss,val_accevaluate(model,test_loader,criterion,device)print(fEpoch{epoch1}/{EPOCHS}| fTrain acc:{train_acc:.4f}| Val acc:{val_acc:.4f})# 保存最优模型ifval_accbest_acc:best_accval_acc torch.save(model.state_dict(),best_model.pth)七、CNN 实战图像分类7.1 完整 CNN 模型importtorch.nnasnnclassSimpleCNN(nn.Module):def__init__(self,num_classes10):super().__init__()self.featuresnn.Sequential(nn.Conv2d(3,32,kernel_size3,padding1),nn.BatchNorm2d(32),nn.ReLU(),nn.MaxPool2d(2),# 112x112nn.Conv2d(32,64,kernel_size3,padding1),nn.BatchNorm2d(64),nn.ReLU(),nn.MaxPool2d(2),# 56x56nn.Conv2d(64,128,kernel_size3,padding1),nn.BatchNorm2d(128),nn.ReLU(),nn.MaxPool2d(2),# 28x28)self.classifiernn.Sequential(nn.Flatten(),nn.Linear(128*28*28,256),nn.ReLU(),nn.Dropout(0.5),nn.Linear(256,num_classes))defforward(self,x):xself.features(x)xself.classifier(x)returnx7.2 用预训练模型迁移学习比自己训练快得多、效果好得多importtorchvision.modelsasmodels# 加载预训练 ResNet18modelmodels.resnet18(pretrainedTrue)# 冻结特征层只训练分类头forparaminmodel.parameters():param.requires_gradFalse# 替换最后一层10 分类model.fcnn.Linear(model.fc.in_features,10)# 只优化最后一层optimizeroptim.Adam(model.fc.parameters(),lr0.001)迁移学习的价值数据少几千张也能训出好模型——特征层已经被 ImageNet 训练过了。7.3 训练技巧学习率1e-3 起步loss 不降就降到 1e-4Batch SizeGPU 显存允许下尽量大32/64/128早停验证集连续 N 轮不提升就停学习率调度scheduler optim.lr_scheduler.StepLR(optimizer, step_size5, gamma0.1)。八、GPU 训练8.1 单卡训练# 检查 GPUnvidia-smidevicetorch.device(cudaiftorch.cuda.is_available()elsecpu)modelmodel.to(device)# 数据也要 .to(device)8.2 多卡训练DataParallel# 单机多卡modelnn.DataParallel(model)modelmodel.to(device)8.3 训练速度优化torch.backends.cudnn.benchmark Truepin_memoryTrueDataLoadernum_workers调大AMP 混合精度fromtorch.cuda.ampimportautocast,GradScaler scalerGradScaler()forimages,labelsintrain_loader:optimizer.zero_grad()withautocast():# 半精度前向outputsmodel(images)losscriterion(outputs,labels)scaler.scale(loss).backward()# 混合精度反向scaler.step(optimizer)scaler.update()AMP 能提速 1.5-3 倍显存减半。九、模型保存与部署9.1 保存# 只存参数推荐体积小torch.save(model.state_dict(),model.pth)# 存整个模型含结构体积大# torch.save(model, model_full.pth)9.2 加载modelSimpleCNN(num_classes10)model.load_state_dict(torch.load(model.pth,map_locationcpu))model.eval()# 别忘了切推理模式9.3 推理defpredict(image):model.eval()withtorch.no_grad():imageimage.unsqueeze(0)# 加 batch 维度 (1,3,224,224)outputmodel(image)probtorch.softmax(output,dim1)_,predoutput.max(1)returnpred.item(),prob.max().item()9.4 部署方案方式特点ONNX 导出 ONNX Runtime跨平台、CPU 快、生产首选TorchScriptPyTorch 原生TensorRTNVIDIA GPU 极致加速Flask/FastAPI 包 HTTP最快落地Triton生产级推理服务# 导出 ONNXtorch.onnx.export(model,dummy_input,model.onnx,input_names[input],output_names[output],dynamic_axes{input:{0:batch}})# FastAPI 部署fromfastapiimportFastAPIimportonnxruntimeasort appFastAPI()sessionort.InferenceSession(model.onnx)app.post(/predict)defpredict(image_bytes:bytes):...十、常见坑速查报错/现象原因解决CUDA out of memory显存不够减小 batch / AMP / 小模型shape mismatch维度不对打印 tensor.shape 检查梯度为 None参数没连到 loss检查 forward 是否用了该参数训练 loss 不降学习率不对/数据没归一化调 lr / 加 Normalize过拟合train 好 val 差数据少/模型大增强/正则/Dropout/早停推理结果错乱忘了 model.eval()加 eval no_grad复现不了随机种子固定 seeddevice mismatch参数和数据在不同设备统一 .to(device)本章小结PyTorch 的学习路径张量 → 自动求导 → nn.Module → DataLoader → 训练循环 → 迁移学习 → 部署。所有深度学习任务的骨架都是那 5 行训练循环——把模板背下来然后往里填模型和数据。下一篇讲 Elasticsearch——搜索与日志分析的实战工具。全文完
网站建设高端定制企业官网