Pytorch 学习

基础知识

张量

创建

张量维度 代表含义
0维张量 代表的是标量(数字)
1维张量 代表的是向量
2维张量 代表的是矩阵
3维张量 时间序列数据、股价、文本数据、单张彩色图片(RGB)
4维张量 批量图像数据 (batch of images)
5维张量 视频数据 (frames, height, width, channels, batch)

比如3D 和 4D的张量:

(width, height, channel) = 3D
(batch_size, width, height, channel) = 4D

torch.Tensor 是存储和变换数据的主要工具

创建张量:

import torch
x = torch.rand(4, 3) # 生成一个形状为 (4, 3) 的 2D 张量(矩阵)。
print(x)
----
tensor([[0.3920, 0.1392, 0.0969],
        [0.1793, 0.9098, 0.9486],
        [0.7765, 0.3908, 0.2206],
        [0.5960, 0.5988, 0.8483]])

如果想要全 0 的:x = torch.zeros(4, 3, dtype=torch.long)

构建时,如果直接使用数据:

x = torch.tensor([5.5, 3]) 
---
tensor([5.5000, 3.0000])

基于已经存在的 tensor,创建一个 tensor

# 创建一个新的全1矩阵tensor,返回的tensor默认具有相同的torch.dtype和torch.device
x = x.new_ones(4, 3, dtype=torch.double) 
# 重置数据类型
x = torch.randn_like(x, dtype=torch.float)

常见的构造Tensor的方法

函数 功能
Tensor(sizes) 基础构造函数,创建一个未初始化的张量,形状由 sizes 指定。
tensor(data) 从数据(如列表或 NumPy 数组)创建张量,类似于 np.array
ones(sizes) 创建一个全 1 的张量,形状由 sizes 指定。
zeros(sizes) 创建一个全 0 的张量,形状由 sizes 指定。
eye(sizes) 创建一个单位矩阵(对角为 1,其余为 0),形状由 sizes 指定。
arange(s, e, step) 创建一个从 se(不包括 e),步长为 step 的一维张量。
linspace(s, e, steps) 创建一个从 se(包括 e),均匀分成 steps 份的一维张量。
rand(sizes) 创建一个形状为 sizes 的张量,元素值服从 [0, 1) 的均匀分布。
randn(sizes) 创建一个形状为 sizes 的张量,元素值服从标准正态分布 N(0,1) N(0, 1)
normal(mean, std) 创建一个张量,元素值服从均值为 mean,标准差为 std 的正态分布。
randperm(m) 创建一个长度为 m 的张量,包含 0m-1 的随机排列。

操作

加法:

# 方式1:
x = torch.rand(4, 3) 
y = torch.rand(4, 3) 
print(x + y)

# 方式2:
print(torch.add(x,y))

# 方式3:in-place,原值修改
y.add_(x)

索引操作: 索引出来的结果与原数据共享内存,修改一个,另一个会跟着修改。如果不想修改,可以考虑使用copy()等方法

x = torch.rand(4,3)
print(x)
print(x[:,1]) # 取第二列,index = 1


y = x[0,:] # 第一行,index=0
y += 1
print(y)
print(x[0, :]) # 源tensor也被改了了

维度变换:常见的方法有torch.view()torch.reshape()

x = torch.randn(4, 4)
y = x.view(16)
z = x.view(-1, 8) # -1是指这一维的维数由其他维度决定
---

tensor([[ 0.7926, -2.7580,  0.5512, -0.7697],
        [-1.1667, -0.3090,  0.5744,  0.1126],
        [ 0.9695, -1.4327, -0.2198, -1.0607],
        [ 0.3800, -0.3354,  0.2768,  0.1085]])
tensor([ 0.7926, -2.7580,  0.5512, -0.7697, -1.1667, -0.3090,  0.5744,  0.1126,
         0.9695, -1.4327, -0.2198, -1.0607,  0.3800, -0.3354,  0.2768,  0.1085])
tensor([[ 0.7926, -2.7580,  0.5512, -0.7697, -1.1667, -0.3090,  0.5744,  0.1126],
        [ 0.9695, -1.4327, -0.2198, -1.0607,  0.3800, -0.3354,  0.2768,  0.1085]])

注: torch.view() 返回的新tensor与源tensor共享内存(其实是同一个tensor),更改其中的一个,另外一个也会跟着改变。

广播机制

对两个形状不同的 Tensor 按元素运算时,可能会触发广播(broadcasting)机制:先适当复制元素使这两个 Tensor 形状相同后再按元素运算

由于x和y分别是1行2列和3行1列的矩阵,如果要计算x+y,那么x中第一行的2个元素被广播 (复制)到了第二行和第三行,⽽y中第⼀列的3个元素被广播(复制)到了第二列。如此,就可以对2个3行2列的矩阵按元素相加。

x = torch.arange(1, 3).view(1, 2)
print(x)
y = torch.arange(1, 4).view(3, 1)
print(y)
print(x + y)

tensor([[1, 2]])
tensor([[1],
        [2],
        [3]])
tensor([[2, 3],
        [3, 4],
        [4, 5]])

自动求导

$$

J=\left(\begin{array}{ccc}\frac{\partial y_{1}}{\partial x_{1}} & \cdots & \frac{\partial y_{1}}{\partial x_{n}} \ \vdots & \ddots & \vdots \ \frac{\partial y_{m}}{\partial x_{1}} & \cdots & \frac{\partial y_{m}}{\partial x_{n}}\end{array}\right)

$$

REF