RuntimeError: expected scalar type Float but found Byte:表格读出的图像先转浮点

简介: 该问题源于Dataset中图像特征误转为`np.uint8`,导致DataLoader输出`torch.uint8`张量,而Linear层权重为`float32`,类型不匹配报错。需在前向传播前统一将输入特征转为与权重一致的dtype(如`float32`)并归一化,同时确保标签保持`torch.long`,避免混淆类型修复与数据读取错误。(239字)

原帖在 Dataset 中把图像特征 astype(np.uint8),DataLoader 因而得到 Byte 张量,第一层 Linear 却使用浮点权重:

RuntimeError: expected scalar type Float but found Byte

Byte 特征和 long 标签承担不同角色

原题在数据读取时转 np.uint8,模型前向又需要浮点权重。先把实际进入 Linear 的 images 与权重对齐,不要把标签也一起变成浮点。还应检查是否误丢最后一列特征,避免类型修复掩盖 CSV 读取错误。

失败发生在模型前向,不是 NLLLoss 的标签类型检查。先在 logps = model(images) 前打印两个实际矩阵的类型:

print("josh050608")
print("images:", images.shape, images.dtype, images.device)
print("weight:", model[0].weight.shape, model[0].weight.dtype, model[0].weight.device)
print("labels:", labels.shape, labels.dtype)

若特征确实是 Byte,先保留 batch 维展平,再按权重的设备和 dtype 转换:

weight = model[0].weight
images = images.flatten(1).to(device=weight.device, dtype=weight.dtype)
assert images.shape[1] == model[0].in_features
logps = model(images)
labels = labels.to(device=logps.device, dtype=torch.long)
loss = criterion(logps, labels)

代码需已有 import torch。只有确认原始像素范围是 0–255 时,才额外除以 255;若文件里已经是小数特征,原先转 uint8 反而可能截断信息,应该在 Dataset 阶段保留 float32。

原帖用 iloc[idx,1:-1],可能把最后一列丢掉。应先检查文件是否有尾部空列以及实际特征列数,确保每张图恰有 256 个值,再 reshape 到 16×16。不能靠修改 Linear 掩盖读取错列。

修复后验证输入类型与权重一致、logps 为 [N,10],标签是 0–9 编号,再执行 backward。

从 0–255 合成像素走通 NLLLoss

下面明确使用 uint8 像素,因此转换后除以 255 有依据。真实文件若本来就是浮点特征,应在读取阶段保留,不要先截断为 Byte:

import torch
from torch import nn
pixels = torch.arange(2 * 256).remainder(256).to(torch.uint8).reshape(2, 1, 16, 16)
labels = torch.tensor([2, 7], dtype=torch.long)
model = nn.Sequential(nn.Linear(256, 32), nn.ReLU(), nn.Linear(32, 10), nn.LogSoftmax(dim=1))
weight = model[0].weight
features = pixels.flatten(1).to(dtype=weight.dtype, device=weight.device) / 255.0
assert features.shape == (2, 256)
assert features.dtype == weight.dtype
log_probs = model(features)
loss = nn.NLLLoss()(log_probs, labels)
loss.backward()
assert model[0].weight.grad is not None
assert torch.isfinite(loss)
print("source/converted/loss:", pixels.dtype, features.dtype, loss.item())

原题 iloc[idx,1:-1] 会排除最后一列。先看原表列数、最后一列是否真为空、去掉标签后是否恰有 256 个特征,再决定切片。若最后一列是有效像素,应该保留;若是文件尾部解析出的空列,应明确清理规则。

若转换过的 .to() 或 .float() 没接返回值,后续模型仍使用旧 Byte 张量,检查实际失败行传入的对象,而非另一份变量。类型统一应在 Dataset 或统一 batch 入口完成,训练和验证走同一路径。

验收输入范围、特征数、模型 dtype 与 [N,10] 输出,再做 backward。把标签改成 long 只解决分类目标约定,不会替图像输入完成浮点化。

参考:原始求助帖;技术依据:torch.from_numpy(2.5)、Linear(2.5)、NLLLoss(2.5)、pandas 2.2 to_numpy。

相关文章
|
2天前
|
人工智能 资源调度 API
阿里云Token Plan最新优惠:额度上调70%以上,新客首购5折,Lite套餐19.5元月起
阿里云百炼对核心订阅服务 Token Plan 进行重大升级:引入通用Credits统一计量,一份订阅覆盖多模型、多任务,全面兼容Claude Code、Cursor等主流开发工具;四档个人套餐额度平均上调超70%,新老用户同享,自11月9日起陆续生效。价格上个人版39元/月起,新客首购5折,Lite低至19.5元/月,另有夜间调用4折起;团队版强调数据安全与高并发。文章还给出额度补齐、升级折算及分人群选购建议。
阿里云Token Plan最新优惠:额度上调70%以上,新客首购5折,Lite套餐19.5元月起
|
2天前
|
机器学习/深度学习 缓存 并行计算
cuDNN error: CUDNN_STATUS_INTERNAL_ERROR:长时间 DQN/LSTM 训练先保留失败前证据
该问题描述在Windows旧nightly版PyTorch上训练DQN/LSTM数小时后触发`CUDNN_STATUS_INTERNAL_ERROR`,非随机性偶发,与deterministic设置无关。需通过步级监控内存、输入状态与CUDA上下文,定位累积资源异常或特定批次触发点,强调小复现、进程隔离与对照实验,而非简单调参。
|
2天前
|
缓存 Unix PyTorch
OSError: [Errno 24] Too many open files:两个 DataLoader 可以 zip,先查文件描述符
原帖双Loader并发读取ZIP导致“Too many open files”(Errno 24),实为文件描述符泄漏或生命周期管理不当,非ZIP不支持DataLoader。需排查Dataset中图像/HDF5/ZIP句柄是否及时释放,并优先采用单Loader配对Dataset保障数据一致性与资源可控性。(239字)
|
2天前
|
并行计算 IDE PyTorch
No module named "torch":Notebook 能导入,终端脚本却失败时先对齐解释器
该问题本质是Python环境不一致:Notebook与控制台使用了不同解释器。需比对`sys.executable`路径,确认torch是否安装在当前运行环境中,并用`python -m pip`精准安装,避免路径错配。(239字)
|
2天前
|
并行计算 PyTorch Linux
libtorch_python.so: cannot open shared object file:文件缺失时先修复 torch 安装
该问题核心是 PyTorch 1.0.1.post2 安装不完整,`torch/lib/` 下缺失关键文件 `libtorch_python.so`,非环境变量(LD_LIBRARY_PATH)可解决。需先用 `importlib.util.find_spec` 定位真实安装路径,核对文件存在性;再通过 `pip show -f torch` 验证分发完整性。切勿混用版本或复制库文件。
|
2天前
|
并行计算 IDE PyTorch
No module named "torch":Notebook 能导入,终端脚本却失败时先对齐解释器
该问题本质是Python环境不一致:Notebook与控制台使用了不同解释器,导致torch仅安装在其中一个环境中。关键在于比对`sys.executable`路径,确认实际运行环境,并在对应环境精准安装(推荐`python -m pip install torch`),而非盲目重装。
|
2天前
|
并行计算 PyTorch Linux
RuntimeError: CUDA error: device-side assert triggered:Colab 先重启,再找首次断言
该文详解CUDA断言错误调试策略:强调先重启运行时、启用`CUDA_LAUNCH_BLOCKING=1`,用最小张量验证环境;区分“会话已坏”与新操作触发,主张逐段定位而非臆测标签越界,提供实用边界检查函数与验证流程。(239字)
|
2天前
|
并行计算 PyTorch 异构计算
can’t convert CUDA tensor to numpy:只取分类索引时直接用 torch.argmax
原帖因直接对CUDA张量调用`.data.numpy().argmax()`报错:“无法将CUDA张量转为NumPy”。正确做法是:在GPU上用`output.argmax(dim=1).item()`获取单图预测索引,避免全量拷贝,仅传回标量,高效且安全。(239字)
|
2天前
|
数据可视化 PyTorch 算法框架/工具
only batches of spatial targets supported:三通道分割 one-hot 转为每像素类别编号
该报错源于PyTorch交叉熵要求标签为`[N, H, W]`(3D),但输入了`[N, 3, H, W]`(4D)掩码。需先验证三通道是否为互斥one-hot,再用`argmax(dim=1)`转为整型标签,并妥善处理全零未标注像素(设`ignore_index`),避免误判为背景类。(239字)
|
2天前
|
编解码 PyTorch 算法框架/工具
DataLoader worker exited unexpectedly:Windows 超分辨率先暴露单进程内存错误
该帖探讨PyTorch在Windows 10/1.4.0下DataLoader子进程异常退出问题:`num_workers=0`后仍出现约9GB CPU分配失败或GPU OOM。指出关键在于诊断真实内存需求——需逐级验证`dataset[0]`、单样本batch、前向传播,确认超分辨率数据是否成对裁块,并强调Windows下必须用`if __name__ == "__main__":`保护入口。(239字)

热门文章

最新文章