上篇聊了用Python做数据分析。今天进入深度学习领域——PyTorch。

面试时被问到"你用过深度学习吗",很多人要么说"用过,调过包",要么干脆说"没用过"。其实面试官想听的不是你会不会import torch,而是你理不理解训练流程的每一步在干什么,以及能不能把深度学习用到机器人场景里。

Tensor:PyTorch的基本数据结构

PyTorch的核心是Tensor——可以理解为能跑在GPU上的NumPy数组。

import torch

# 创建Tensor
a = torch.tensor([1.0, 2.0, 3.0])
b = torch.zeros(3, 4)          # 3x4全零矩阵
c = torch.randn(2, 3)          # 2x3随机矩阵(标准正态分布)

# 基本运算
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
y = (x ** 2).sum()
y.backward()    # 自动求梯度
print(x.grad)   # tensor([2., 4., 6.])

requires_grad=True是关键——它告诉PyTorch记录所有对这个Tensor的操作,以便后续自动求梯度。这是训练神经网络的基础。

和NumPy的转换也很简单:tensor.numpy()转NumPy数组,torch.from_numpy()反过来。注意它们共享内存,改一个另一个也会变。

用PyTorch做一个简单的分类器

机器人领域最常见的深度学习任务之一是物体识别。我们从一个简单的全连接网络开始:

import torch.nn as nn

class SimpleClassifier(nn.Module):
    def __init__(self, input_dim, num_classes):
        super().__init__()
        self.net = nn.Sequential(
            nn.Linear(input_dim, 128),
            nn.ReLU(),
            nn.Dropout(0.3),
            nn.Linear(128, 64),
            nn.ReLU(),
            nn.Linear(64, num_classes)
        )
    
    def forward(self, x):
        return self.net(x)

nn.Module是所有PyTorch模型的基类。__init__定义网络结构,forward定义前向传播。nn.Sequential把多个层串起来,写起来很简洁。

Dropout是正则化手段——训练时随机把30%的神经元输出置零,防止过拟合。面试时如果被问"你怎么防止过拟合",Dropout是标准答案之一。

训练循环:每一步在干什么

训练一个模型,核心就是不断重复这几步:前向传播→计算损失→反向传播→更新参数。

model = SimpleClassifier(input_dim=784, num_classes=10)
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
criterion = nn.CrossEntropyLoss()

for epoch in range(10):
    model.train()  # 开启训练模式(启用Dropout等)
    total_loss = 0
    
    for images, labels in train_loader:
        # 1. 前向传播
        outputs = model(images)
        loss = criterion(outputs, labels)
        
        # 2. 反向传播
        optimizer.zero_grad()  # 清空上一步的梯度(必须做!)
        loss.backward()        # 计算梯度
        optimizer.step()       # 更新参数
        
        total_loss += loss.item()
    
    print(f"Epoch {epoch+1}, Loss: {total_loss/len(train_loader):.4f}")

几个容易踩的坑:optimizer.zero_grad()必须在loss.backward()之前调用,否则梯度会累加。另外model.train()和model.eval()的区别很重要——训练时Dropout会随机丢弃神经元,BatchNorm用当前batch的统计量;评估时则相反。忘了切换模式是新手最常犯的错误之一。

数据集和数据加载

PyTorch用Dataset和DataLoader管理数据。自定义数据集只需要继承Dataset,实现__len__和__getitem__:

from torch.utils.data import Dataset, DataLoader

class RobotGraspDataset(Dataset):
    def __init__(self, data_dir, transform=None):
        self.samples = load_samples(data_dir)  # 加载数据列表
        self.transform = transform
    
    def __len__(self):
        return len(self.samples)
    
    def __getitem__(self, idx):
        image, label = self.samples[idx]
        if self.transform:
            image = self.transform(image)
        return image, label

dataset = RobotGraspDataset('./data')
loader = DataLoader(dataset, batch_size=32, shuffle=True, num_workers=4)

DataLoader的几个参数很关键:batch_size控制每批大小,shuffle在每个epoch打乱数据,num_workers用多进程加载数据加速训练。

模型保存和部署

训练好的模型需要保存下来部署。PyTorch推荐保存状态字典:

torch.save(model.state_dict(), 'model.pth')
model.load_state_dict(torch.load('model.pth'))

为什么推荐state_dict而不是保存整个模型?因为它只存参数不存结构,更灵活也更安全。

实际项目中,部署时通常用TorchScript或ONNX格式导出,在C++端用libtorch或ONNX Runtime推理,速度更快也不依赖Python环境。

在机器人项目中怎么用

实际项目中,深度学习通常用在感知模块。比如用摄像头拍一张桌面照片,用训练好的模型识别出上面有哪些物体,然后机器人去抓取。训练在Python里完成,部署到C++的机器人系统里用TorchScript推理——这是目前最主流的方案。

面试中怎么聊深度学习

面试官问深度学习,想考察的不只是你会不会用PyTorch。他想看的是:你理不理解训练过程、能不能选择合适的网络结构和超参数、知不知道怎么评估模型。

一个好的回答:先说你解决了什么问题,用了什么网络结构(以及为什么选它),然后说训练过程中的关键决策——比如数据增强策略、学习率调度、怎么防止过拟合。最后给出量化的结果——准确率多少、推理速度多快。

如果你还能聊聊模型部署的经验——怎么把Python训练的模型部署到C++的机器人系统里——那就很加分了。

PyTorch与机器人视觉

在机器人领域,PyTorch最常用于视觉感知任务,比如目标检测、语义分割、抓取姿态估计等。实际项目中,通常先在服务器上训练好模型,然后导出为ONNX或TorchScript格式部署到机器人端。面试时经常被问到模型部署的延迟问题,这时候可以提到用TensorRT做推理加速,或者用模型量化来减小模型体积和推理时间。

给正在准备面试的你

如果你还没用过PyTorch,建议跑通一个完整的图像分类项目——从准备数据、定义模型、训练、评估到保存和加载。Kaggle上有很多入门数据集,两三个小时就能跑通。

面试的时候,能讲出一个完整的项目经历,比背十个深度学习概念有用得多。

下篇聊Python脚本自动化——批量处理和数据清洗的实用技巧。


如果这篇文章对你有帮助,欢迎点赞、在看、转发三连。 你的支持是我持续更新的最大动力。

「机器人软件开发面试·从入门到精通」连载系列 上一篇:第76篇 Python在数据分析中的应用——处理实验日志和性能统计 下一篇预告:第78篇 Python脚本自动化——批量处理、数据清洗的实用技巧

有任何问题欢迎评论区留言,我会尽量回复。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐