PyTorch面试精华


1 PyTorch全局设置

    1.1  全局设置当前设备

    1.2  全局设置浮点精度

    1.3  设置控制台输出格式

2 向量与梯度之核心

    2.1  Tensor的组成与存储

    2.2  Tensor的grad属性

    2.3  Tensor内存布局的调整

    2.4  Tensor的叠加

    2.5  禁用梯度计算

    2.6  向量的保存和加载

    2.7  梯度消失与梯度爆炸

3 神经网络基础

    3.1  线性网络的参数以及初始化

    3.2  PyTorch计算图

    3.3  查看网络权重参数

    3.4  保存模型

    3.5  Adam相关面试题

    3.6  ReLu与非线性的理解

    3.7  Train模式和Eval模式

    3.8  线性网络

    3.9  双线性网络

    3.10  惰性线性层

    3.11  参数向量

    3.12  叶子节点

    3.13  自动求导与链式求导

    3.14  Dropout机制

    3.15  detach原理

    3.16  半精度训练

    3.17  Xavier初始化

    3.18  通道的深刻理解

    3.19  1x1卷积的作用

    3.20  注意力机制

    3.21  requires_grad属性

    3.22  向量的device

    3.23  tensor与numpy互换

    3.24  DataParallel用法详解

    3.25  to(device)和.cuda()的区别

    3.26  Dataset数据处理

    3.27  StepLR学习率调度器

    3.28  词嵌入的理解

    3.29  特征提取和可视化

    3.30  TensorDataset的使用

PyTorch计算图

创建时间:2023-02-22 | 更新时间:2024-09-05 | 阅读次数:1050 次

2.1、什么是计算图?

计算图(Computational Graph)就是记录运算过程的有向无环图,比如前向传播时输入张量经过加、减、乘、除得到输出张量,那么计算图就会记录输入输出张量、加减乘除运算和一些中间变量,这是进行反向传播的前提。

2.2、PyTorch计算图的特点是什么?

(1)Pytorch的计算图就是动态的,几乎每进行一次运算都会拓展原先的计算图,最后生成完成。

(2)当反向传播完成,计算图默认会被清除,所以只能用生成的计算图进行一次反向传播。

(3)retain_graph 参数可以保持计算图,从而避免别清除掉,其用法为:loss.backward(retain_graph=True)。代码举例如下所示:

import torch
x = torch.randn((1,4),dtype=torch.float32,requires_grad=True)
y = x ** 2
z = y * 4
print(x)
print(y)
print(z)
loss1 = z.mean()
loss2 = z.sum()
print(loss1,loss2)
loss1.backward()    # 这个代码执行正常,但是计算图会释放
loss2.backward()    # 这时会引发错误

程序正常执行到最后一行报错: RuntimeError: Trying to backward through the graph a second time, but the buffers have already been freed. Specify retain_graph=True when calling backward the first time.

代码分析:计算loss1的backward的时候,计算图x-y-z结构被释放了,而计算loss2的backward仍然试图利用x-y-z的结构,因此会报错。只需要设置retain_graph参数为True即可保留计算图,从而两个loss的backward()不会相互影响。正确的代码应当是:

# 这里参数表明保留backward后的中间参数。
loss1.backward(retain_graph=True)

# 执行完这个代码后,所有中间变量都会被释放,以便下一次的循环
loss2.backward()
本教程共40节,当前为第12节!