《动手学深度学习》—— 第2章 预备知识 —2.1数据操作
·
2025年10月21日
2.1.数据操作
2.1.1.入门
tensor 是一个张量,它表示一个多维的矩阵或数组。
# 创建一个张量
# 使用 arange 创建一个行向量 x ,这个行向量包含以0开始的前12个整数,它们默认创建为整数
x = torch.arange(12)
# 上式结果 tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
y = torch.tensor([1.0, 2.0, 3.0])
目标形状是(高度,宽度),那么在知道宽度后,高度会被自动计算得出
要想改变一个张量的形状而不改变元素数量和元素值,可以调用reshape函数,reshape(行,列)
例如,可以把张量x从形状为(12,)的行向量转换为形状为(3,4)的矩阵
2.1.2.运算符
torch.exp(x) 会对张量 x 中的每个元素计算 e 的 x 次方,即:exp(x)=e的x幂
张量连结,参数 dim 控制了拼接的方向
torch.cat((x, y), dim=0)
# dim=0 表示沿着第一个维度(通常是 行)进行拼接,列数 保持不变
# dim=1 表示沿着第二个维度(通常是 列)进行拼接,行数 保持不变
求和,对张量中的所有元素进行求和,会产生一个单元素张量
x.sum()
# 结果是 tensor(66.)
2.1.4.索引和切片
第一个元素的索引是0,最后一个元素索引是-1
X[-1], X[1:3]
# [-1]选择最后一个元素
# [1:3]选择第二个和第四个元素
Python 的切片操作是左闭右开区间
X[0:2, :] 表示:行部分 0:2,选择 第 0 行和第 1 行;列部分 :,选择 所有列
2.1.5.节省内存
id()函数:内存中引用对象的确切地址
before = id(Y)
Y = Y + X
id(Y) == before
# 结果为 False
# 首先计算Y + X,为结果分配新的内存,然后使Y指向内存中的这个新位置
但是,我们希望原地执行这些更新
使用切片表示法将操作的结果分配给先前分配的数组
Z[:] = X + Y
使用 X[:] = X + Y 或 X += Y 来减少内存开销
2.1.6.转换为其他Python对象
-
深度学习框架中的张量 特别之处:
-
自动求导(Autograd)支持
-
GPU 加速支持。可以使用 .to(device) 或 .cuda() 方法将张量移动到 GPU 上
-
内存优化和惰性计算
-
稀疏张量类型,允许以更高效的方式存储和操作这些数据,避免不必要的零值存储
-
将深度学习框架定义的张量转换为NumPy张量,torch张量和numpy数组将共享它们的底层内存
A = X.numpy() # 将 PyTorch 的 Tensor 转换为 NumPy 数组
调用item()函数或Python的内置函数,将大小为1的张量转换为Python标量
a = torch.tensor([3.5])
a.item()
# 结果是3.5
更多推荐
所有评论(0)