【PyTorch 核心】张量 (Tensor) 的创建

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

引言:什么是张量?

在 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常用场景
全 1torch.ones()torch.ones_like()单位化、掩码 (Mask)
全 0torch.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.arangestart, end, step左闭右开 [start, end)自动推断 (Int/Float)循环索引、生成指定步长序列
torch.linspacestart, end, steps左闭右闭 [start, end]浮点数 (Float)画图坐标轴、生成等分序列
torch.randsize[0, 1)浮点数 (Float32)均匀分布初始化、概率模拟
torch.randnsize(−∞,+∞)(-\infty, +\infty)(,+) (均值0方差1)浮点数 (Float32)标准正态分布初始化 (模型权重)
torch.randintlow, high, size左闭右开 [low, high)整数 (Long/Int64)生成随机索引、随机标签

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值