引言:什么是张量?
在 PyTorch 中,所有的数据运算都是通过张量 (Tensor) 来完成的。您可以将张量理解为一个多维数组,它是 PyTorch 进行深度学习计算的基本数据结构。无论是输入数据、神经网络的权重,还是模型的输出,本质上都是张量。
本文档将介绍创建 PyTorch 张量的几种基本且常用的方法。
一、张量的基本创建
1.从现有数据创建张量
这是最常用、最直观的创建方式,即根据已有的数据(如 Python 列表、NumPy 数组)来构建张量。
方法:torch.tensor()
torch.tensor() 是一个工厂函数,它会智能地分析输入数据,并创建一个具有相应数据类型和维度的张量。这是官方推荐的、从数据创建张量的首选方法。
import torch
import numpy as np
def dm01():
#场景1: 标量 张量
t1 = torch.tensor(10)
print(f't1: {t1},type:{type(t1)}')
#场景2: 二维列表——张量
data = [[1,2,3],[4,5,6]]
t2 = torch.tensor(data)
print(f't2: {t2},type:{type(t2)}')
#场景3:numpy nd数组
data = np.random.randint(1, 10, size=(2, 3))
t3 = torch.tensor(data)
print(f't3: {t3},type:{type(t3)}')
if __name__ == '__main__':
dm01()
核心优势:
- 智能:自动推断数据类型(int -> torch.int64, float -> torch.float32)。
- 安全:它会复制一份数据,而不是与原始数据(尤其是NumPy数组)共享内存。
- 灵活:可以通过 dtype 参数显式指定所需的数据类型。
2. 根据形状创建张量
有时我们需要先创建一个特定形状的“容器”张量,然后再填充数据。
方法:torch.Tensor()
torch.Tensor() 是一个类构造函数。当传入维度参数时,它会创建一个指定形状的张量。
import torch
def dm01():
#场景1:直接创建 指定维度(例如:2行3列)张量
t4 = torch.Tensor(2, 3)
print(f't4: {t4},type:{type(t4)}')
if __name__ == '__main__':
dm01()
3⚡ 核心区别对比:torch.tensor 与 torch.Tensor
| 特性 | torch.tensor() (小写 t, 函数) | torch.Tensor() (大写 T, 类) |
|---|---|---|
| 本质类型 | 工厂函数 (Factory Function) | 类构造函数 (Class Constructor, torch.FloatTensor 的别名) |
| 主要用途 | ✅ 推荐使用。用于从现有数据(list, numpy)创建新张量。 | ⚠️ 不推荐。主要用于分配指定形状的内存(未初始化),或在极少数情况下强制转 Float。 |
| 数据类型 | 智能推断。输入 int 则是 IntTensor,输入 float 则是 FloatTensor。 | 默认 Float。无论输入什么数据,默认都是 torch.FloatTensor。 |
| 代码示例 | torch.tensor([1, 2]) 👉 IntTensor (int64) | torch.Tensor([1, 2]) 👉 FloatTensor (float32) |
二、 创建指定值张量
1. torch.ones和 torch.ones_like 创建全1张量
当你需要初始化一个单位矩阵或进行掩码操作时,全 1 张量非常有用。
torch.ones(*size): 创建指定形状的全 1 张量。
torch.ones_like(input): 创建一个与 input 形状相同的全 1 张量。
import torch
#创建2行3列全1张量
t1 = torch.ones(2, 3)
print(f't1: {t1}, type:{type(t1)}')
#t2: 3行2列
t2 = torch.tensor([[1, 2], [3, 4], [5, 6]])
print(f't2: {t2}, type:{type(t2)}')
#t3:基于t2形状,创建全1张量
t3 = torch.ones_like(t2) #3行2列 全1矩阵
print(f't3: {t3}, type:{type(t3)}')
2. torch.zeros和torch.zeros_like创建全0张量
全 0 张量常用于 bias(偏置)的初始化或占位符。
torch.zeros(*size): 创建指定形状的全 0 张量。
torch.zeros_like(input): 创建一个与 input 形状相同的全 0 张量。
import torch
#创建2行3列 全0张量
t1 = torch.zeros(2, 3)
print(f't1: {t1}, type:{type(t1)}')
#t2: 3行2列
t2 = torch.tensor([[1, 2], [3, 4], [5, 6]])
print(f't2: {t2}, type:{type(t2)}')
#t3:基于t2形状,创建全0张量
t3 = torch.zeros_like(t2) #3行2列 全0矩阵
print(f't3: {t3}, type:{type(t3)}')
3. torch.full和torch.full like 创建全为指定值张量
如果你需要用 0 和 1 以外的数字(例如 255、-1 等)填充张量,可以使用 full 系列方法。
torch.full(size, fill_value): 创建指定形状,并用 fill_value 填充的张量。
torch.full_like(input, fill_value): 创建与 input 同形,并用 fill_value 填充的张量。
import torch
#创建2行3列全255张量
t1 = torch.full(size=(2, 3), fill_value=255)
print(f't1: {t1}, type:{type(t1)}')
#t2: 3行2列
t2 = torch.tensor([[1, 2], [3, 4], [5, 6]])
print(f't2: {t2}, type:{type(t2)}')
#t3:基于t2形状,创建全255张量
t3 = torch.full_like(t2, fill_value=255) #3行2列 全255矩阵
print(f't3: {t3}, type:{type(t3)}')
4. 总结
| 创建类型 | 指定形状 API | 仿照形状 API | 常用场景 |
|---|---|---|---|
| 全 1 | torch.ones() | torch.ones_like() | 单位化、掩码 (Mask) |
| 全 0 | torch.zeros() | torch.zeros_like() | 初始化偏置 (Bias)、填充 (Padding) |
| 指定值 | torch.full() | torch.full_like() | 固定值填充、常量初始化 |
三、 创建线性和随机张量
1.创建线性张量 (Linear)
生成有规律的数值序列,类似于 Python 原生的 range,但在 PyTorch 中有两个主要选择:基于步长的 arange 和基于数量的 linspace。
1.1 torch.arange: 基于步长
类似于 Python 的 range(start, end, step)。
特点:不包含结束值 (左闭右开区间 [start, end) )。
场景:当你明确知道数值之间的间隔(步长)时使用。
1.2 torch.linspace: 基于数量
即 “Linear Space”(线性等分向量)。
特点:包含结束值 (左闭右闭区间 [start, end] ),自动计算步长。
场景:当你需要将一个区间均匀切分成 n 份时使用(例如画图时的 X 轴坐标)。
import torch
#1. 定义函数,创建线性张量
def dm01():
# 场景1: 创建指定范围的线性张量
# 参1:起始值, 参2:结束值, 参3:步长
t1 = torch.arange(0, 10, 2)
print(f't1: {t1},type:{type(t1)}')
print('-' * 30)
# 场景2: 创建指定范围 线性张量--等差数列
# 参1:起始值, 参2:结束值, 参3:元素的个数
t2 = torch.linspace(1, 10, 5)
print(f't2: {t2},type:{type(t2)}')
if __name__ == '__main__':
dm01()
2.创建随机张量 (Random)
在神经网络中,权重的初始化通常依赖随机数。为了保证实验结果可以复现(即每次运行生成的随机数一样),我们需要设置随机种子。
2.1 随机种子 (Random Seed)
torch.manual_seed(seed):设置种子后,后续生成的随机序列将固定。如果不设置,默认使用系统时间戳,每次结果都不同。
2.2 常用随机函数
torch.rand: 均匀分布。生成 [0, 1) 之间的随机浮点数。
torch.randn: 标准正态分布。均值为 0,方差为 1。
torch.randint: 随机整数。在指定区间 [low, high) 内生成整数。
import torch
#2. 定义函数,创建随机张量
def dm02():
#step1: 设置随机种子
#torch.initial_seed() #默认采用当前系统的时间戳作为随机种子
torch.manual_seed(3) #设置随机种子
#step2: 创建随机张量
#场景1:均匀分布的(0,1)随机张量
t1 = torch.rand(size=(2, 3))
print(f't1: {t1},type:{type(t1)}')
print('-' * 30)
#场景2:符合正态分布的随机张量
t2 = torch.randn(size=(2, 3))
print(f't1: {t2},type:{type(t2)}')
print('-' * 30)
#场景3:创建随机整数张量
t3 = torch.randint(low=1, high=10, size=(3, 5)) #3行2列 全1矩阵
print(f't3: {t3}, type:{type(t3)}')
if __name__ == '__main__':
dm02()
3. 核心 API 对比总结
| 函数名 | 核心参数 | 区间性质 | 数据类型 | 典型用途 |
|---|---|---|---|---|
torch.arange | start, end, step | 左闭右开 [start, end) | 自动推断 (Int/Float) | 循环索引、生成指定步长序列 |
torch.linspace | start, end, steps | 左闭右闭 [start, end] | 浮点数 (Float) | 画图坐标轴、生成等分序列 |
torch.rand | size | [0, 1) | 浮点数 (Float32) | 均匀分布初始化、概率模拟 |
torch.randn | size | (−∞,+∞)(-\infty, +\infty)(−∞,+∞) (均值0方差1) | 浮点数 (Float32) | 标准正态分布初始化 (模型权重) |
torch.randint | low, high, size | 左闭右开 [low, high) | 整数 (Long/Int64) | 生成随机索引、随机标签 |

被折叠的 条评论
为什么被折叠?



