一、基本数据结构——Tensor

1. Tensor 构建

Tensor 是 Pytorch 的基本数据结构,同 numpy 的 ndarray 类似,一般来说,0维代表标量,1维代表向量,2维代表矩阵,3维代表图像、文本等数据。

Tensor 有多种构建方法,包括:

  1. 使用 rand 函数构建随机 tensor:
x = torch.rand(4,4,4)
# 输出 4*4*4 的三维tensor
  1. 使用 zeros 创建全0 tensor:
x = torch.zeros(4, 4, 4, dtype=torch.long)
# 形状同上
  1. 直接只用 Tensor 基于数组创建 tensor:
array = np.array([[1,2,3],[4,5,6]])
x = torch.Tensor(array)
  1. 使用 eye 创建单位矩阵:
x = torch.eye(6)
# 仅能生成二维矩阵
  1. 使用 arange 创建一维向量:
x = torch.arange(0, 10, 2)
  1. 使用 randn 生成正态分布 tensor:
x = torch.randn(4,4,4)
# 形状同第一个

2. Tensor 操作

Tensor 的操作与 ndarray 非常一致,仅有部分需注意的不同点如下:

  1. 可以使用 add_ 直接进行原值操作:
# 使用add_进行原值操作
y = torch.rand(4, 4, 4)
print(y[0,0,0])
x = torch.randn(4, 4, 4)
print(x[0,0,0])
y.add_(x)
print(y[0,0,0])

输出结果如下:

pytorch学不会怎么办 学pytorch的基础_pytorch

  1. 索引切片操作
# 索引操作
x = torch.rand(2,2,2)
print(x)
print("取第0维")
print(x[0,:,:])
print("取第一维")
print(x[:,0,:])
print("取第二维")
print(x[:,:,0])

输出结果如下:

pytorch学不会怎么办 学pytorch的基础_pytorch学不会怎么办_02

注:tensor 的切片方法同 ndarray 一致,对于维度的选择上,可以从最外层的括号出发,不断向里剥,如第0维是最内部括号中的数据,更大的维度依次向外扩展。

  1. view 变换形状操作:
x = torch.rand(2,2,2)
print(x)
y = x.view(2, -1)
print(y)

输出结果如下:

pytorch学不会怎么办 学pytorch的基础_python_03

注:在 view 函数中,维度的选择通过参数数量实现,因此多个参数的乘积应等于总数据数,-1则表示按照数据数动态确定

二、自动求导机制

自动求导、反向传播机制是深度学习、神经网络的核心技术之一,Pytorch 通过 auto_grad 包实现了自动求导机制,同时对每一个 tensor 都支持自动求导,以实现神经网络的参数学习。

自动求导的使用很简单,首先通过声明变量,创建关于核心变量的表达式,接着对表达式进行反向传播,再查看核心变量的梯度值即为表达式对核心变量的梯度计算值:

x = torch.ones(2, 2, requires_grad=True)
# 核心变量x
y = x ** 2
z = y * y * 3
# 表达式z:3 * x^4
# 开始反向传播
z.backward(torch.ones(2,2))
# 由于z是标量,需要向z传递一个同等形状的向量来计算梯度(雅各比矩阵)
print(x.grad)
# 此时x的梯度为从最上层反向传播到x的梯度,即d(z)/d(x)
# z = 3 * x^4
# dz/dx = 12 * x^3 = 12

注意:① 梯度的计算是累积的,因此在每一轮重新计算时,需要通过“x.grad.data.zero_()”清空梯度;②默认情况下 Pytorch 是不保留计算图的,梯度反向传播仅支持一次,可以通过 retain_graph 属性保留计算图