news 2026/8/18 5:16:43

Python-pytorch-基础入门

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python-pytorch-基础入门

PyTorch 基础入门:张量(Tensor)

🔥 什么是张量?

张量(Tensor)是 PyTorch 的核心数据结构,你可以把它理解为可以在 GPU 上加速运算的多维数组。它和 NumPy 的 ndarray 非常相似,但多了三个关键能力:

  1. 自动求导(Autograd)——自动计算梯度
  2. GPU 加速——张量可以搬到 GPU 上,实现百倍级提速
  3. 动态计算图——每次前向传播都是一张新图,调试方便
术语维度示例
标量(Scalar)0 维torch.tensor(3.14)
向量(Vector)1 维torch.tensor([1, 2, 3])
矩阵(Matrix)2 维torch.randn(3, 4)
张量(Tensor)≥3 维torch.randn(2, 3, 4, 5)

📦 创建张量

importtorchimportnumpyasnp

从数据创建

# 从列表x=torch.tensor([1,2,3])# tensor([1, 2, 3])# 从嵌套列表(2D)x=torch.tensor([[1,2],[3,4],[5,6]])# tensor([[1, 2],# [3, 4],# [5, 6]])# 从 NumPy 数组arr=np.array([1,2,3])x=torch.from_numpy(arr)# 共享内存x=torch.tensor(arr)# 复制数据# 指定数据类型x=torch.tensor([1,2,3],dtype=torch.float32)

特殊张量

# 全零 / 全一x=torch.zeros(3,4)# (3, 4) 的全零矩阵x=torch.ones(3,4)# (3, 4) 的全一矩阵x=torch.zeros_like(y)# 和 y 形状相同的全零# 单位矩阵x=torch.eye(3)# 3x3 单位矩阵# 未初始化(效率更高,但需立即赋值)x=torch.empty(3,4)# 全填充x=torch.full((3,4),7)# 全为 7 的 (3, 4) 矩阵

序列张量

# 等差x=torch.arange(0,10,2)# tensor([0, 2, 4, 6, 8])x=torch.arange(5)# tensor([0, 1, 2, 3, 4])# 等分x=torch.linspace(0,1,5)# 0 到 1 均匀取 5 个点# tensor([0.0000, 0.2500, 0.5000, 0.7500, 1.0000])# 对数等分x=torch.logspace(-2,2,5)# 10^-2 到 10^2

随机张量 ⭐

# 均匀分布 [0, 1)x=torch.rand(3,4)# 标准正态分布 N(0, 1)x=torch.randn(3,4)# 整数随机 [low, high)x=torch.randint(0,10,(3,4))# 正态分布 N(mean, std)x=torch.normal(mean=0,std=1,size=(3,4))# 随机排列x=torch.randperm(10)# 0-9 的随机排列# 固定随机种子(可复现)torch.manual_seed(42)

📐 张量属性

x=torch.randn(2,3,4)print(x.shape)# torch.Size([2, 3, 4])print(x.size())# 同上,可以传入 dim: x.size(0) → 2print(x.ndim)# 维度数: 3print(x.dtype)# 数据类型: torch.float32print(x.device)# 所在设备: cpu / cuda:0print(x.numel())# 总元素数: 24print(x.requires_grad)# 是否需要梯度

🔢 数据类型(dtype)

类型别名说明
torch.float32torch.float32 位浮点(默认)
torch.float64torch.double64 位双精度
torch.float16torch.half16 位半精度
torch.int64torch.long64 位整数
torch.int32torch.int32 位整数
torch.int88 位整数(量化用)
torch.bool布尔型
torch.bfloat16Brain 浮点(训练用)
# 类型转换x=torch.tensor([1,2,3],dtype=torch.int64)x=x.float()# → float32x=x.double()# → float64x=x.to(torch.float16)# → float16x=x.type(torch.int32)# → int32# 创建时指定x=torch.tensor([1.0,2.0],dtype=torch.float64)

⚙️ 基本运算

算术运算

a=torch.tensor([1,2,3],dtype=torch.float32)b=torch.tensor([4,5,6],dtype=torch.float32)# 逐元素运算(支持广播)print(a+b)# tensor([5., 7., 9.])print(a-b)# tensor([-3., -3., -3.])print(a*b)# tensor([4., 10., 18.]) 逐元素乘法!print(a/b)# tensor([0.2500, 0.4000, 0.5000])print(a**2)# tensor([1., 4., 9.])# 原地操作(名称后带 _ 下划线)a.add_(1)# a += 1,直接修改 aa.mul_(2)# a *= 2

矩阵运算

A=torch.randn(3,4)B=torch.randn(4,5)# 矩阵乘法C=A @ B# 推荐写法C=torch.mm(A,B)# 只支持 2DC=torch.matmul(A,B)# 支持广播# 批矩阵乘法A=torch.randn(10,3,4)# batch=10B=torch.randn(10,4,5)C=torch.bmm(A,B)# (10, 3, 5)# 转置print(A.T)# 2D 转置print(A.transpose(0,1))# 交换两个维度print(A.permute(1,0,2))# 任意维度重排# 点积 / 外积v1,v2=torch.randn(3),torch.randn(3)dot=torch.dot(v1,v2)# 内积(点积)outer=torch.outer(v1,v2)# 外积

统计运算

x=torch.randn(3,4)print(x.sum())# 所有元素求和print(x.sum(dim=0))# 沿行求和(压缩行)→ (4,)print(x.sum(dim=1))# 沿列求和(压缩列)→ (3,)print(x.mean())# 均值print(x.std())# 标准差print(x.var())# 方差print(x.max())# 最大值print(x.min())# 最小值print(x.argmax())# 最大值索引(展平后)print(x.argmax(dim=1))# 每行最大值索引 → (3,)

比较运算

x=torch.tensor([1,2,3,4,5])print(x>3)# tensor([False, False, False, True, True])print(x==3)# tensor([False, False, True, False, False])print((x>2)&(x<5))# tensor([False, False, True, True, False])print(torch.any(x>3))# Trueprint(torch.all(x>0))# True

🎯 索引与切片

x=torch.randn(4,5)# 基本索引print(x[0])# 第 0 行 → (5,)print(x[0,1])# 第 0 行第 1 列 → 标量print(x[:,0])# 第 0 列 → (4,)# 切片print(x[:2])# 前 2 行print(x[1:3,2:4])# 行 1-2, 列 2-3print(x[::2])# 每隔一行# 高级索引indices=torch.tensor([0,2,3])print(x[indices])# 取第 0, 2, 3 行print(x[[0,2],[1,3]])# 取 (0,1) 和 (2,3) 两个元素# 布尔索引mask=x>0print(x[mask])# 所有 >0 的元素(展平为一维)

🔧 形状操作

x=torch.randn(2,3,4)# view / reshapey=x.view(-1,4)# 自动推导第一维 → (6, 4)y=x.reshape(6,4)# 同上,但 view 要求内存连续# 升维 / 降维y=x.unsqueeze(0)# 在第 0 维前插入 → (1, 2, 3, 4)y=x.unsqueeze(-1)# 在最后一维后插入 → (2, 3, 4, 1)y=x.squeeze()# 删除所有长度为 1 的维度# 展平y=x.flatten()# 完全展平 → (24,)y=x.flatten(start_dim=1)# 从第 1 维开始展平 → (2, 12)# 拼接与堆叠a,b=torch.randn(2,3),torch.randn(2,3)c=torch.cat([a,b],dim=0)# 沿 dim=0 拼接 → (4, 3)c=torch.cat([a,b],dim=1)# 沿 dim=1 拼接 → (2, 6)c=torch.stack([a,b],dim=0)# 新维度堆叠 → (2, 2, 3)# 分割chunks=torch.chunk(x,chunks=3,dim=1)# 均分为 3 块parts=torch.split(x,split_size_or_sections=2,dim=0)# 每块 2 行

↔️ NumPy 互转

# Tensor → NumPyx=torch.randn(3,4)arr=x.numpy()# CPU 上直接转换(共享内存!)arr=x.cpu().detach().numpy()# GPU 张量安全转换# NumPy → Tensorarr=np.array([1,2,3])x=torch.from_numpy(arr)# 共享内存x=torch.tensor(arr)# 复制一份新数据

⚠️torch.from_numpy()和张量调用.numpy()是共享内存的,改一个另一个也会变!


🖥️ 设备管理

# 查看可用设备print(torch.cuda.is_available())# 是否有 GPUprint(torch.cuda.device_count())# GPU 数量# 创建时指定设备x=torch.randn(3,4,device='cuda')# 直接在 GPU 上创建x=torch.randn(3,4,device='cuda:0')# 指定 GPU 编号# 移动张量x=x.to('cuda')# 移到 GPUx=x.cuda()# 同上x=x.to('cpu')# 移回 CPUx=x.cpu()# 同上# 设备无关代码device=torch.device('cuda'iftorch.cuda.is_available()else'cpu')x=torch.randn(3,4).to(device)

📝 速查表

需求代码
创建列表张量torch.tensor([1, 2, 3])
全零torch.zeros(3, 4)
全一torch.ones(3, 4)
标准正态随机torch.randn(3, 4)
均匀随机torch.rand(3, 4)
等差数列torch.arange(0, 10, 2)
等分数列torch.linspace(0, 1, 10)
矩阵乘法A @ B
转置x.T/x.transpose(0, 1)
改变形状x.view(-1, 4)/x.reshape(6, 4)
插入维度x.unsqueeze(0)
删除1维x.squeeze()
展平x.flatten()
拼接torch.cat([a, b], dim=0)
堆叠torch.stack([a, b], dim=0)
沿轴求和x.sum(dim=0)
NumPy→Tensortorch.from_numpy(arr)
Tensor→NumPyx.numpy()
移到GPUx.to('cuda')
数据类型x.float()/x.long()

[[pytorch-总览|← 返回总览]]

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/18 5:16:41

Python-pytorch-自动求导

PyTorch 自动求导&#xff08;Autograd&#xff09; &#x1f916; 什么是自动求导&#xff1f; 自动求导&#xff08;Autograd&#xff09;是 PyTorch 最核心的特性之一&#xff0c;它自动计算神经网络中所有参数的梯度&#xff0c;让你无需手动推导和实现反向传播。PyTorch 使…

作者头像 李华
网站建设 2026/8/18 5:13:56

多模态AI智能体记忆评估:WorldMemArena基准测试与工程实践

1. 项目缘起&#xff1a;当AI智能体开始“健忘”最近在折腾一个多模态AI智能体项目&#xff0c;遇到了一个让我头疼了好几天的问题。我的智能体在完成一个需要多步骤、跨模态&#xff08;比如先看一张图&#xff0c;再根据指令操作一个网页&#xff09;的复杂任务时&#xff0c…

作者头像 李华
网站建设 2026/8/18 5:13:15

DrawAI:基于智能体工作流实现光栅图像可编辑化的技术架构与实践

1. 从“不可编辑”到“可编辑”&#xff1a;一个被忽视的行业痛点在数字内容创作领域&#xff0c;我们每天都在与海量的光栅图像打交道。无论是设计师从客户那里收到的JPG产品图&#xff0c;还是运营从网上找到的PNG素材&#xff0c;亦或是摄影师拍摄的RAW文件转换后的TIFF&…

作者头像 李华
网站建设 2026/8/18 5:12:16

大模型记忆系统实战:从向量化存储到混合索引召回

1. 从“健忘”到“有记忆”&#xff1a;为什么大模型需要记忆系统如果你用过早期的ChatGPT&#xff0c;或者一些开箱即用的基础大模型&#xff0c;肯定遇到过这样的场景&#xff1a;你跟它聊了十几轮&#xff0c;详细讨论了一个项目的技术方案&#xff0c;然后你问它“我们刚才…

作者头像 李华
网站建设 2026/8/18 5:11:07

Java开发者必备:OpenJDK源码下载、构建与高效阅读全攻略

1. 为什么我们需要阅读JDK源码&#xff1f; 作为一名有几年经验的Java开发者&#xff0c;你可能已经熟练掌握了各种框架的使用&#xff0c;能快速搭建Spring Boot项目&#xff0c;也能处理日常的业务逻辑。但你是否曾有过这样的困惑&#xff1a;为什么 HashMap 的负载因子默…

作者头像 李华
网站建设 2026/8/18 5:10:21

涂鸦Wukong框架:如何用大模型与硬件抽象打造AI原生智能硬件?

1. 从“智能单品”到“AI原生硬件”&#xff1a;为什么我们需要新的开发框架&#xff1f;最近和几个做智能硬件的朋友聊天&#xff0c;大家都有一个共同的感受&#xff1a;现在的“智能硬件”越来越不“智能”了。很多产品&#xff0c;无非是在传统设备上加了个Wi-Fi模块&#…

作者头像 李华