PyTorch 张量基础(一)
📅 2026/7/29 2:05:02
👁️ 阅读次数
📝 编程学习
前言
本文梳理 PyTorch 入门核心知识:张量全套创建操作。读完本文你将掌握各类张量创建 API、使用场景与代码示例。
一、深度学习基础导论
1. ML(机器学习)和 DL(深度学习)的关系与区别
基础定义
- ML(Machine Learning,机器学习):让机器从数据里学习规律、完成预测任务的一大类方法,是一个大集合。
- DL(Deep Learning,深度学习):属于机器学习的子集,依托多层神经网络实现学习。
核心区别
| 对比维度 | 传统机器学习 | 深度学习 |
|---|---|---|
| 特征处理 | 需要人工手动设计特征(特征工程) | 自动从原始数据学习特征,无需人工提取 |
| 数据需求量 | 中小规模数据即可取得不错效果 | 十分依赖大量数据,数据越少优势越弱 |
| 模型结构 | 结构较浅,通常只有 1~2 层计算单元 | 多层堆叠的神经网络(深度网络) |
| 硬件要求 | 普通 CPU 就能运行 | 大多需要 GPU 加速训练 |
| 可解释性 | 大多模型逻辑清晰,容易分析预测依据 | 黑盒特性,很难解释模型做出判断的内在原因 |
| 典型算法 | 逻辑回归、SVM、随机森林、K-Means | CNN、RNN、Transformer 等深度网络 |
通俗理解:机器学习是"教会电脑做题";深度学习是"教会电脑先看懂题目,再自己做题"。
2. 深度学习的 5 个核心特点
- 多层网络结构:由多层神经元堆叠而成,"深度"一词来源于多层网络结构;层数越多,网络深度越高。
- 自动特征提取:不需要人工设计特征,模型直接接收原始数据(图片像素、文本字符),逐层自动提炼底层、高层特征。
- 海量数据驱动:模型参数量巨大,需要大量样本才能充分训练;数据量越大,深度学习相比传统机器学习的优势越明显。
- 强大的拟合能力:多层非线性变换可以拟合极其复杂的数据分布,适合图像、语音、自然语言这类高难度任务。
- 模型可解释性弱:深度网络常被称作"黑盒模型",我们很难清晰解释模型究竟依据哪些信息输出最终结果,难以追溯推理过程。
3. 深度学习常用基础模型
- CNN(卷积神经网络,Convolutional Neural Network)
擅长处理网格结构数据,最典型就是图片;依靠卷积操作提取局部空间特征。
应用:图像分类、目标检测、图像分割。 - RNN(循环神经网络,Recurrent Neural Network)
专门处理时序序列数据,拥有记忆能力,可以利用上一步的信息辅助当前计算。
应用:语音识别、时序预测、早期文本处理。
拓展:RNN 衍生变体 LSTM、GRU;当前主流序列模型为 Transformer。
4. 深度学习典型 4 类应用场景
- 计算机视觉(CV)
图像识别、人脸识别、自动驾驶视觉感知、图像生成(AI 绘画)。 - 自然语言处理(NLP)
机器翻译、聊天大模型、文本摘要、情感分析。 - 语音信号处理
语音转文字、语音合成、语音降噪、声纹识别。 - 多模态与推荐系统
短视频内容推荐、图文跨模态检索、智能机器人感知交互。
二、张量的创建
本节学习目标
- 掌握基础张量创建方式
- 掌握 0/1、指定值张量创建
- 掌握线性张量、随机张量创建
- 掌握张量数据类型指定与完整类型转换方案
2.1 什么是张量
PyTorch 中的张量就是元素为同一种数据类型的多维矩阵。在 PyTorch 中,张量以类的形式封装,张量相关运算、处理方法都内置在类中。
张量是 PyTorch 的核心数据抽象:
- 一维张量:向量
- 二维张量:矩阵
- 更高维度张量可以用来存放图片、语音等复杂数据。
PyTorch 张量 vs NumPy 数组
二者外观相似,都是存放同类型元素的多维数组,可以互相转换,核心区别:
- 运行设备:NumPy 数组仅支持 CPU;张量支持 CPU 与 GPU(CUDA 加速)
- 自动微分:NumPy 不支持求导;张量支持梯度记录、自动求导(深度学习核心)
- 定位场景:NumPy 面向通用科学计算;张量专门服务深度学习训练
2.2 基础张量创建方式
torch.tensor:根据指定数据创建张量,可通过dtype直接指定元素类型torch.Tensor:根据形状创建张量,也可传入数据创建张量torch.IntTensor、torch.FloatTensor、torch.DoubleTensor:老式 API,创建固定类型张量
代码示例
import torch import numpy as np 创建指定类型张量 t1 = torch.tensor([1, 2, 3, 4, 5], dtype=torch.float) # torch.float 等价 float32 print(f't1: {t1}, (元素)类型: {t1.dtype}, (张量对象)类型: {type(t1)}') 标量(0 维张量) t2 = torch.tensor(10) print(f't2: {t2}, type: {type(t2)}') print('-' * 30) 二维列表 → 张量 data = [[1, 2, 3], [4, 5, 6]] t3 = torch.tensor(data) print(f't3: {t3}, type: {type(t3)}') print('-' * 30) numpy ndarray → 张量 data = np.random.randint(0, 10, size=(2, 3)) t4 = torch.tensor(data) print(f't4: {t4}, type: {type(t4)}') 错误写法:torch.tensor(2,3) 直接传维度会报错 t5 = torch.tensor(2, 3)老式类型专用张量 API
import torch # 传入形状,创建未初始化张量 t_int1 = torch.IntTensor(2, 3) # int32 t_float1 = torch.FloatTensor(2, 3) # float32 t_double1 = torch.DoubleTensor(2, 3) # float64 传入数据,强制指定类型 t_int2 = torch.IntTensor([1, 2, 3]) t_float2 = torch.FloatTensor([1.1, 2.2]) t_double2 = torch.DoubleTensor([0.1, 0.2]) 现代等价写法 t_int = torch.tensor([1, 2, 3], dtype=torch.int32) t_float = torch.tensor([1.1, 2.2], dtype=torch.float32) t_double = torch.tensor([0.1, 0.2], dtype=torch.float64)区分重点:
t1.dtype:张量内部元素的数据类型type(t1):张量本身 Python 对象类型,永远是torch.Tensor
2.3 创建 0、1、指定值张量
torch.ones和torch.ones_like:创建全 1 张量torch.zeros和torch.zeros_like:创建全 0 张量torch.full和torch.full_like:创建全部为指定值张量
不带_like:手动传入维度;带_like:参考已有张量,自动复制形状、数据类型、设备。
import torch ref = torch.tensor([[1, 2], [3, 4]], dtype=torch.float32) 全 1 张量 t_ones = torch.ones(2, 3) t_ones_like = torch.ones_like(ref) 全 0 张量 t_zeros = torch.zeros(2, 3) t_zeros_like = torch.zeros_like(ref) 指定值张量 t_full = torch.full((2, 3), fill_value=5.0) t_full_like = torch.full_like(ref, fill_value=5.0)2.4 创建线性和随机张量
torch.arange()和torch.linspace():创建线性张量torch.random.initial_seed():获取当前全局随机种子torch.random.manual_seed():设置全局随机种子torch.rand() / torch.randn():创建随机浮点类型张量torch.randint(low, high, size=()):创建随机整数类型张量
随机种子两种方法区别
- torch.random.manual_seed(种子数值)
作用:设置全局随机种子。种子固定后,后续所有随机操作生成结果固定;影响当前进程全部随机函数。
调用时机:代码开头统一设置。 - torch.random.initial_seed()
作用:读取当前正在使用的全局种子,只能获取,不能修改;返回整数。
用途:查看当前种子、复现实验、记录日志。
import torch # 线性张量 t_arange = torch.arange(0, 10, 2) # [start, end),按步长生成 t_lin = torch.linspace(0, 10, 5) # [start, end],均分生成指定个数点 设置全局随机种子,固定随机结果 torch.random.manual_seed(666) 获取当前全局种子 current_seed = torch.random.initial_seed() print("当前种子:", current_seed) 随机浮点张量 rand_t = torch.rand(3, 3) # [0,1) 均匀分布 randn_t = torch.randn(3, 3) # 标准正态分布 N(0,1) 随机整数张量 randint_t = torch.randint(0, 10, (2, 2)) # [low, high) 随机整数2.5 张量数据类型转换
方法 1:创建张量时直接指定 dtype(推荐)
t = torch.tensor([1, 2, 3], dtype=torch.float32)方法 2:.to() 通用类型转换(通用,支持类型+设备)
t_int = torch.tensor([1, 2]) t_float = t_int.to(dtype=torch.float32) t_long = t_int.to(dtype=torch.int64)方法 3:专用简写函数(简洁,仅改类型)
t = torch.tensor([1.1, 2.2]) t_float32 = t.float() t_float64 = t.double() t_int32 = t.int() t_int64 = t.long() t_bool = t.bool()常用 dtype 对照表
| 常量简写 | 完整常量 | 含义 |
|---|---|---|
| torch.float | torch.float32 | 32 位浮点数(训练默认) |
| torch.double | torch.float64 | 64 位双精度浮点数 |
| torch.int | torch.int32 | 32 位整数 |
| torch.long | torch.int64 | 64 位长整型(索引默认) |
| torch.bool | torch.bool | 布尔类型 True/False |
重要提醒:所有类型转换都会生成新张量,原张量不会被修改。
参考资料
- PyTorch 官方网站:PyTorch
- 黑马程序员 PyTorch 深度学习教程
编程学习
技术分享
实战经验