Ai笔记(二)-PyTorch 中各类数据类型(numpy array、list、FloatTensor、LongTensor、Tensor)的区别

在 PyTorch 中,经常会看到 numpy array、list、FloatTensor、LongTensor、Tensor 之间反复转换。

这些转换不是随机发生的,而是有特定目的和作用

下面给你系统地讲清楚它们的区别、用途、为什么要转换、什么时候必须转换


🚀 1. numpy array → torch.Tensor:为什么必须转换?

📌 场景:你用 Python/Numpy 加载或处理数据

例如:

复制代码
import numpy as np
x = np.array([[1.0, 2.0], [3.0, 4.0]])

但是模型需要:

复制代码
torch.Tensor 作为输入

否则会报错。

⭐ 原因:

PyTorch 的模型层(Conv、Linear、LSTM......)只接受 torch.Tensor,不接受 numpy array。

因为 Tensor 才能:

  • 放到 GPU (tensor.cuda())

  • 自动求导

  • 作为网络层输入

所以必须转:

复制代码
x = torch.from_numpy(x).float()

或:

复制代码
x = torch.tensor(x, dtype=torch.float32)

🚀 2. 为什么有 FloatTensor、LongTensor、BoolTensor?数据类型重要吗?

非常重要,不同 dtype 影响:

  • 是否能参与运算

  • 是否能反向传播

  • 是否能用于索引

  • GPU 计算速度

  • 内存占用

📌 PyTorch 常用类型对比表

作用 类型 用途
实数计算(模型输入、权重) FloatTensor / float32 神经网络训练标准类型
整数(索引、类别标签) LongTensor / int64 分类任务的 label 必须用这个
布尔值 BoolTensor 掩码、padding mask
半精度 float16 / bfloat16 加速推理、节省显存

❗示例:分类标签必须是 LongTensor

复制代码
labels = torch.tensor([1,2,0], dtype=torch.long)
loss = CrossEntropyLoss()
loss(output, labels)

如果你用 float,会直接报错:

复制代码
Expected target class index as LongTensor

🚀 3. numpy 转 Tensor 的好处(也是原因)

⭐ 好处 1:支持 GPU 加速

numpy 只能在 CPU,用不了 CUDA。

复制代码
x = torch.tensor(x).cuda()

⭐ 好处 2:支持自动求导(autograd)

PyTorch Tensor 可以:

  • 跟踪计算图

  • 自动求梯度(用于训练)

numpy 不行。


⭐ 好处 3:支持 PyTorch 所有神经网络层

卷积、LSTM、Transformer 等层 只能接收 torch.Tensor


🚀 4. 为什么有时需要 Tensor → numpy?

例如:

场景 1:可视化 / matplotlib 绘图

matplotlib 只能接受 numpy。

复制代码
plt.plot(tensor.cpu().numpy())

场景 2:保存到文件(如 .npy)

复制代码
np.save("features.npy", tensor.cpu().numpy())

场景 3:做不需要梯度的传统机器学习

如 sklearn(只支持 numpy)。

场景 3:做不需要梯度的传统机器学习


🚀 5. item() ------Tensor → Python 数字

✔ 用法:从单元素 Tensor 里取值

t = torch.tensor(3.14) t.item() # → 3.14 (python float)

✔ 为什么要用 item()?

因为许多地方必须用 Python int/float,不能用 Tensor:

例如:

1️⃣ 作为切片参数(Tensor 不允许)

length = tensor_length.item() x[:, :length] # 正确

2️⃣ 打印 loss、保存 loss

loss_value = loss.item()

3️⃣ tqdm 显示、日志记录

pbar.set_postfix({"loss": loss.item()})


🚀 6. 那 item() 和 numpy() 有什么区别?(重要)

功能 item() numpy()
取单值 ❌ 必须是一维或多维
转 Python 数字 ❌ 得到 numpy array
用于切片/日志
是否需要 CPU 不需要 必须先 .cpu()

示例:

t = torch.tensor([3.14])

t.numpy() # array([3.14]) ← numpy array

t.item() # 3.14 ← python float

🌟 item() = Tensor → Python scalar

🌟 numpy() = Tensor → Numpy array

🚀 7**. 为什么 dataset / dataloader 会自动转换?**

你在 Dataset 中经常看到:

复制代码
sequence = torch.FloatTensor(self.sequences[idx])
length = torch.tensor(self.lengths[idx], dtype=torch.long)

原因:

  • sequence 是模型的输入,需要 float32(FloatTensor)

  • length 是序列长度,需要整数(LongTensor,用于 pack/pad)

如果不转换,模型会报错。


🚀 8**. 各类型转换的实际用途(总结)**

类型 来源 去向 典型用途 示例
numpy array 数据集加载、文件(.npy/.npz)、图像处理 转成 Tensor 输入到模型之前 x = np.array([1,2,3])``x = torch.from_numpy(x)
list Python 原生结构 转 Tensor 标签、序列、长度、配置 lst = [1,2,3]``torch.tensor(lst)
FloatTensor / float32 模型输入、权重、特征 神经网络层、GPU 默认训练 dtype x = torch.tensor([1.,2.], dtype=torch.float32)
LongTensor / int64 标签、索引、序列长度 Loss、embedding、pack/pad 分类任务标签必须用 LongTensor labels = torch.tensor([0,1], dtype=torch.long)
BoolTensor mask、条件过滤 Transformer mask、padding mask 掩码操作、过滤无效元素 mask = (x > 0).bool()
float16 / bfloat16 AMP、推理优化 GPU 张量 节省显存 / 加速推理 x = x.half()with torch.cuda.amp.autocast():
Tensor → numpy 网络输出、特征 matplotlib、sklearn、文件保存 可视化、后处理 arr = t.detach().cpu().numpy()
Tensor.item() 单元素 Tensor Python 数字 打印 loss、日志、monitor loss_value = loss.item()

🔥 最常见的正确写法(开发者常用写法)

🔹 图像 / 特征输入

复制代码
x = torch.tensor(np_array, dtype=torch.float32)

🔹 分类标签

复制代码
y = torch.tensor(label, dtype=torch.long)

🔹 序列 mask

复制代码
mask = (lengths > 0).bool()

🔹 输出转 numpy 作图

复制代码
output_np = output.detach().cpu().numpy()

🎯 4. 常见报错与解决方案

❌ CrossEntropyLoss expects LongTensor

➡ 使用:

labels = torch.tensor(labels, dtype=torch.long)


❌ CUDA tensor cannot be converted to numpy

➡ 先 .cpu()

arr = tensor.cpu().numpy()


❌ Tensor is not writable

➡ 复制:

tensor = torch.tensor(tensor)

⭐ 最终一段话总结

numpy → Tensor 是为了让数据能进入神经网络和 GPU,并支持自动求导。
Tensor → numpy 是为了可视化、保存、或使用传统 ML 工具。
不同 dtype 是为了满足模型对输入类型的严格要求。

相关推荐
小鸡吃米…几秒前
机器学习 - 贝叶斯定理
人工智能·python·机器学习
esmap3 分钟前
技术解构:ESMAP AI数字孪生赋能传统行业转型的全链路技术方案
人工智能·低代码·ai·架构·编辑器·智慧城市
不懒不懒6 分钟前
【逻辑回归从原理到实战:正则化、参数调优与过拟合处理】
人工智能·算法·机器学习
喜欢吃豆9 分钟前
对象存储架构演进与AI大模型时代的深度融合:从S3基础到万亿参数训练的技术全景
人工智能·架构
ba_pi13 分钟前
每天写点什么2026-02-2(1.5)数字化转型和元宇宙
大数据·人工智能
vlln17 分钟前
【论文速读】MUSE: 层次记忆和自我反思提升的 Agent
人工智能·语言模型·自然语言处理·ai agent
Funny_AI_LAB21 分钟前
RAD基准重新定义多视角异常检测,传统2D方法为何战胜前沿3D与VLM?
人工智能·目标检测·3d·ai
星河队长22 分钟前
人工智能的自我认知
人工智能
无人装备硬件开发爱好者26 分钟前
AI 赋能航天造物:LEAP71 式火箭发动机计算工程软件开发全解析 1
人工智能·商业火箭发动机·增材加工·leap71
数智联AI团队29 分钟前
AI搜索引领行业变革:2023年GEO优化服务市场深度洞察与专业机构选择指南
人工智能