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) = 4Dtorch.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) |
创建一个从 s 到 e(不包括 e),步长为 step 的一维张量。 |
linspace(s, e, steps) |
创建一个从 s 到 e(包括 e),均匀分成 steps 份的一维张量。 |
rand(sizes) |
创建一个形状为 sizes 的张量,元素值服从 [0, 1) 的均匀分布。 |
randn(sizes) |
创建一个形状为 sizes 的张量,元素值服从标准正态分布 。 |
normal(mean, std) |
创建一个张量,元素值服从均值为 mean,标准差为 std 的正态分布。 |
randperm(m) |
创建一个长度为 m 的张量,包含 0 到 m-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)
$$