首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

PyTorch:深度学习开发的 Py一级加速!

PyTorch:深度学习开发的Py一级加速!

深度学习开发的世界里,PyTorch绝对是个狠角色。

不管是研究生刷论文,还是工程师搞项目,PyTorch都能凭借它那“快、灵、易”的特性占据一席之地。

这次咱们就聊聊PyTorch的几个核心亮点,不打玄乎,直接上干货!

1.

张量,深度学习的砖头瓦块

要说深度学习的“地基”,非张量(Tensor)莫属了。在PyTorch里,张量就是个能用来存数据的多维数组,和NumPy的数组差不多,但更“带劲”:它能直接扔到GPU上跑,速度飞起。

创建张量

来点代码感受下张量的操作:

importtorch

创建一个2x3的随机张量

x=torch.rand(2,3) print(x)

创建一个全是0的张量

zeros=torch.zeros(2,3) print(zeros)

创建一个全是1的张量

ones=torch.ones(2,3) print(ones)

运行完,你会看到各种矩阵数据,随机数也好,全1全0也罢,随你喜欢。温馨提示:要是你还想知道张量的维度,那就用x.shape,它会告诉你张量的大小。

2.

自动微分,梯度算得比人快

深度学习离不开梯度。如果你还不知道梯度是啥,可以简单理解为“模型该往哪儿改,改多少”。在PyTorch里,自动微分(Autograd)就是个帮你算梯度的好工具,省得你手撕公式。

梯度的计算

来看看自动微分是怎么帮我们干活的:

importtorch

创建一个张量

x=torch.tensor(2.0,requires_grad=True)

定义一个简单的函数y=x^2

y=x**2

反向传播,计算梯度

y.backward()

查看梯度

print(x.grad)#输出应该是4.0

代码里,requires_grad=True就是告诉PyTorch:“这个变量的梯度我得用,记得帮我算。”执行y.backward()后,x的梯度就躺在.grad属性里了。

温馨提示:梯度计算完别忘了清零,不然梯度会累积到下一次计算里。清零的方法很简单:x.grad.zero_()。

3.

动态计算图,灵活得不像话

PyTorch最大的杀手锏之一就是它的动态图。简单来说,计算图是用来描述计算过程的。在PyTorch里,计算图是动态的,边运行边生成,想怎么改都行。这种灵活性,特别适合调试和研究新模型。

举个例子,假如你想写个循环计算模型损失的代码:

importtorch

x=torch.tensor(1.0,requires_grad=True)

foriinrange(3): y=x**(i+1) y.backward(retain_graph=True)#保留计算图,方便下一次计算 print(f“第{i+1}次梯度:{x.grad}”) x.grad.zero_()#清除梯度

每次循环,计算图会重新生成,灵活得一匹。

4.

GPU加速,跑得飞快

搞深度学习,不用GPU?这就跟骑三轮车去赛跑似的。PyTorch对GPU的支持非常好,代码里只要加一丢丢改动,就能把数据和模型扔到显卡上跑。

把张量扔到GPU

只需要一句.to('cuda'),张量就能飞到GPU里:

importtorch

检查有没有GPU

device=torch.device(“cuda”iftorch.cuda.is_available()else“cpu”)

创建一个张量并转移到GPU

x=torch.rand(2,3).to(device) print(x)

如果你的机器有显卡,那跑起来会比CPU快得多。温馨提示:GPU的显存可是有限的,别一次性塞太多数据,不然可能会炸显存。

5.

模块化设计,模型搭建无压力

在PyTorch里,神经网络的搭建用的是torch.nn.Module,也就是个“模块化拼装”的思路。你只需要写清每一层的结构,剩下的PyTorch会帮你搞定。

搭建一个简单的神经网络

下面是一个三层全连接网络的例子:

importtorch importtorch.nnasnn

定义网络

classSimpleNet(nn.Module): def__init__(self): super(SimpleNet,self).init() self.fc1=nn.Linear(3,5)#输入3个特征,输出5个特征 self.fc2=nn.Linear(5,2)#输入5个特征,输出2个特征

defforward(self,x): x=torch.relu(self.fc1(x))#激活函数ReLU x=self.fc2(x) returnx

创建网络

net=SimpleNet() print(net)

这里forward定义了数据的前向传播过程,PyTorch会根据它自动生成计算图。你只需要关注模型的结构和逻辑,反向传播、梯度啥的都不用操心。

6.

训练模型,像流水线一样顺滑

训练模型的过程其实很固定,无非就是:数据->前向传播->计算损失->反向传播->更新参数。PyTorch把这些都设计得非常顺手。

训练流程代码

importtorch importtorch.nnasnn importtorch.optimasoptim

定义简单模型

model=nn.Linear(2,1) criterion=nn.MSELoss()#均方误差损失 optimizer=optim.SGD(model.parameters(),lr=0.01)#随机梯度下降优化器

假数据

x=torch.tensor([[1.0,2.0],[2.0,3.0]]) y=torch.tensor([[3.0],[5.0]])

训练循环

forepochinrange(100):

前向传播

outputs=model(x) loss=criterion(outputs,y)

反向传播

optimizer.zero_grad() loss.backward() optimizer.step()

打印损失

温馨提示:优化器的zero_grad()一定记得加,不然梯度会越积越多,结果就会乱套。

7.

PyTorch的生态,工具一大堆

PyTorch的生态做得也很好,比如torchvision专门搞图像处理,torchaudio应对音频任务,还有torchtext处理文本数据。直接用现成的工具库,开发效率能上天。

这次就说到这儿了,PyTorch真的是个又快又灵活的深度学习框架。

张量、自动微分、动态图、GPU加速……这些东西都是它的核心亮点,掌握好它们,搞深度学习轻松不少!

‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌

往期回顾

01

02

03

分享

收藏

在看

点赞

  • 发表于:
  • 原文链接https://page.om.qq.com/page/O_N88_yXH1NeVwxT8A5_60fg0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券