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 是为了满足模型对输入类型的严格要求。

相关推荐
极客BIM工作室26 分钟前
BERT模型中词汇表向量与网络权重:从属关系与不可替代的功能分工
人工智能·自然语言处理·bert
不羁的木木37 分钟前
【开源鸿蒙跨平台开发学习笔记】Day02:React Native 开发 HarmonyOS-环境搭建篇(填坑记录)
笔记·学习·react native·harmonyos·har
百***688238 分钟前
开源模型应用落地-工具使用篇-Spring AI-Function Call(八)
人工智能·spring·开源
许泽宇的技术分享40 分钟前
从零到一,开源大模型的“民主化“之路:一份让AI触手可及的实战宝典
人工智能·开源·大模型
文慧的科技江湖42 分钟前
开源 | 企业级开源人工智能训练推理平台 - GPU池化平台 - GPU算力平台 - GPU调度平台 - AI人工智能操作系统
人工智能·开源·gpu池化·推理平台·训练平台·gpu管理平台·ai人工智能操作系统
东皇太星42 分钟前
VGGNet (2014)(卷积神经网络)
人工智能·神经网络·cnn·卷积神经网络
Dev7z1 小时前
智能情感识别:基于USB摄像头和深度学习的实时面部表情分析系统
人工智能·深度学习
IT_陈寒1 小时前
JavaScript 闭包通关指南:从作用域链到内存管理的8个核心知识点
前端·人工智能·后端
CodeCraft Studio1 小时前
全新AI增强Demo发布:DHTMLX Gantt与Diagram如何通过LLM更智能地构建项目与组织结构
人工智能·ai·项目管理·甘特图·dhtmlx gantt·gantt·llm大模型