深度学习基础:Tensor(张量)的创建方法详解

文章目录
- 一、什么是张量(Tensor)?
- 二、张量的创建方法
- 1️⃣ 直接创建张量(从列表或数据生成)
- 2️⃣ 使用 `torch.zeros()`、`torch.ones()`、`torch.full()` 创建固定值张量
- 3️⃣ 使用 `torch.arange()`、`torch.linspace()` 创建序列张量
- 4️⃣ 使用 `torch.rand()`、`torch.randn()` 创建随机张量
- 5️⃣ 使用 `torch.eye()` 创建单位矩阵
- 6️⃣ 从 NumPy 数组创建张量
- 7️⃣ 创建与现有张量形状相同的新张量
- 三、张量创建总结表
- 📚 参考资料
一、什么是张量(Tensor)?
简单来说,张量就是多维数组(multi-dimensional array)。
在 PyTorch 中,torch.Tensor 是一个包含数值的多维容器,可以存放在 CPU 或 GPU 上。
具体内容请参考深度学习中的张量(Tensor)入门-CSDN博客
| 种类 | 示例 | 维度 |
|---|---|---|
| 标量(Scalar) | torch.tensor(5) | 0D |
| 向量(Vector) | torch.tensor([1,2,3]) | 1D |
| 矩阵(Matrix) | torch.tensor([[1,2],[3,4]]) | 2D |
| 三维及以上张量 | torch.randn(2,3,4) | 3D+ |
二、张量的创建方法
在 PyTorch 中,有多种方式可以创建张量。
下面按类型详细介绍。
1️⃣ 直接创建张量(从列表或数据生成)
- 最基础的方式是使用
torch.tensor()直接从 Python 列表或嵌套列表创建。
import torch# 从列表创建张量
x = torch.tensor([1, 2, 3])
print(x)# 从嵌套列表创建二维张量
m = torch.tensor([[1, 2], [3, 4]])
print(m)
注意:
- 默认数据类型为
torch.float32或torch.int64(取决于输入类型)。 - 可以通过
dtype参数指定类型:
- 也可以使用
torch.Tensor(size)创建指定形状的张量
import torch# 创建指定形状的张量,默认类型为float32
tensor1 = torch.Tensor(3, 2, 4)
print(tensor1)
print(tensor1.dtype)# 也可以用来创建指定内容的张量
tensor2 = torch.Tensor([[1, 2, 3, 4], [5, 6, 7, 8]])
print(tensor2)
- 下边是以上两种方式创建指定类型的张量、
可通过torch.IntTensor()、torch.FloatTensor()等创建。
或在torch.tensor()中通过dtype参数指定类型。
import torch# 创建int16类型的张量
tensor1 = torch.ShortTensor(2, 2)
tensor2 = torch.tensor([1, 2, 3], dtype=torch.int16)
print(tensor1, tensor1.dtype)
print(tensor2, tensor1.dtype)# 创建int32类型的张量
tensor1 = torch.IntTensor(2, 3)
tensor2 = torch.tensor([3, 4, 5], dtype=torch.int32)
print(tensor1)
print(tensor2)# 元素类型不匹配则会进行类型转换
tensor1 = torch.IntTensor([1.1, 2.2, 3.6])
tensor2 = torch.tensor([3.1, 2.2, 1.6], dtype=torch.int32)
print(tensor1)
print(tensor2)# 创建float32类型的张量
tensor1 = torch.FloatTensor([7, 8, 9])
tensor2 = torch.tensor([1, 2, 3], dtype=torch.float32)
print(tensor1, tensor1.dtype)
print(tensor2, tensor1.dtype)# 创建float64类型的张量
tensor1 = torch.DoubleTensor(2, 3, 1)
tensor2 = torch.tensor([1, 2, 3], dtype=torch.float64)
print(tensor1)
print(tensor2)
2️⃣ 使用 torch.zeros()、torch.ones()、torch.full() 创建固定值张量
这类函数非常常用,常用于初始化权重、偏置等。
# 全零张量
z = torch.zeros((2, 3))
print(z)# 全一张量
o = torch.ones((2, 3))
print(o)# 固定值张量
f = torch.full((2, 3), 7)
print(f)
3️⃣ 使用 torch.arange()、torch.linspace() 创建序列张量
适合生成规律性的数值序列,是一种指定区间的张量创建。
# arange: 从 start 到 end(不含 end),步长 step
a = torch.arange(0, 10, 2)
print(a) # [0, 2, 4, 6, 8]# linspace: 从 start 到 end,均匀生成 num 个数
b = torch.linspace(0, 1, steps=5)
print(b) # [0., 0.25, 0.5, 0.75, 1.]
4️⃣ 使用 torch.rand()、torch.randn() 创建随机张量
随机张量是深度学习中最常见的初始化方式。
# [0, 1) 均匀分布
u = torch.rand((2, 3))
print(u)# 标准正态分布(均值0,方差1),n即normal,代表正态分布
n = torch.randn((2, 3))
print(n)
如果需要指定分布参数,可以使用:
# 自定义均值和方差
normal = torch.normal(mean=0, std=1, size=(3, 3))
5️⃣ 使用 torch.eye() 创建单位矩阵
在矩阵计算(如线性代数)中非常常用。
I = torch.eye(3)
print(I)
# 输出:
# tensor([[1., 0., 0.],
# [0., 1., 0.],
# [0., 0., 1.]])
6️⃣ 从 NumPy 数组创建张量
PyTorch 与 NumPy 可以方便地相互转换。
import numpy as np# NumPy -> Tensor
np_arr = np.array([[1, 2], [3, 4]])
t = torch.from_numpy(np_arr)
print(t)# Tensor -> NumPy
back = t.numpy()
print(back)
这在数据预处理阶段尤其常见。
7️⃣ 创建与现有张量形状相同的新张量
可以使用以下方法快速创建“形状一致”的张量:
x = torch.tensor([[1, 2, 3], [4, 5, 6]])# 与 x 形状相同的全零张量
z = torch.zeros_like(x)# 与 x 形状相同的全一张量
o = torch.ones_like(x)# 与 x 形状相同的随机张量
r = torch.rand_like(x, dtype=torch.float)
三、张量创建总结表
| 方法 | 功能 | 示例 |
|---|---|---|
torch.tensor(data) | 从列表创建张量 | torch.tensor([[1,2],[3,4]]) |
torch.zeros(size) | 创建全零张量 | torch.zeros((3,3)) |
torch.ones(size) | 创建全一张量 | torch.ones((2,4)) |
torch.full(size, val) | 创建固定值张量 | torch.full((2,2), 9) |
torch.arange(start, end, step) | 按步长创建序列 | torch.arange(0, 10, 2) |
torch.linspace(start, end, steps) | 均匀取样序列 | torch.linspace(0, 1, 5) |
torch.rand(size) | 均匀随机分布 | torch.rand((2,3)) |
torch.randn(size) | 标准正态分布 | torch.randn((2,3)) |
torch.eye(n) | 单位矩阵 | torch.eye(3) |
torch.from_numpy(arr) | 从 NumPy 创建 | torch.from_numpy(np_arr) |
torch.zeros_like(t) | 与张量形状相同 | torch.zeros_like(x) |
📚 参考资料
- PyTorch 官方文档:torch.Tensor
- PyTorch 官方文档:torch.tensor
