Expected object of scalar type Float but got scalar type Double for argument #4 'mat1':NumPy 输入与 Linear 权重怎样统一类型

简介: PyTorch中`RuntimeError: Expected Float but got Double`常因输入Tensor(float64)与模型权重(float32)类型不一致导致。关键在第一层Linear的输入与权重dtype需统一:可将数据转为float32(推荐),或模型整体升为float64。务必检查`tensor.dtype`而非数值显示,并确保`loss.backward()`前类型已对齐。(239字)

数据已经转成 Tensor,调用 model(X_trainTensor) 却立刻失败;还没执行 loss.backward(),就看到 Float 和 Double 不一致。遇到下面这条错误,先检查第一层矩阵乘法的输入和权重:

RuntimeError: Expected object of scalar type Float but got scalar type Double for argument #4 'mat1'

先确定要改的是哪两个对象

对应的原始问题使用 47 个特征,模型开头是 Linear(47,33),输入由 torch.from_numpy(X_train) 构造。失败行是:

y_pred = model(X_trainTensor)

这时还没有计算 NLLLoss,先改标签类型解决不了这次前向错误。第一层 Linear 实际计算的是 输入 @ 权重的转置 + 偏置:输入的最后一维应为 47,权重形状为 [33,47],浮点类型也应一致。

下面构造四行示例数据,保留这个 47→33→2 的结构。它不读取原帖的数据,不需要 GPU,可以在已经安装 NumPy、PyTorch 的环境中直接运行:

import numpy as np
import torch
from torch import nn

torch.manual_seed(7)
X_train = np.arange(4 * 47, dtype=np.float64).reshape(4, 47) / 100
X_trainTensor = torch.from_numpy(X_train)
model = nn.Sequential(
    nn.Linear(47, 33), nn.ReLU(),
    nn.Linear(33, 2), nn.LogSoftmax(dim=1),
)
first = model[0]
print("josh050608")
print("input:", X_trainTensor.shape, X_trainTensor.dtype, X_trainTensor.device)
print("weight:", first.weight.shape, first.weight.dtype, first.weight.device)
print("numpy dtype:", X_train.dtype)
try:
    model(X_trainTensor)
except RuntimeError as exc:
    print("forward error:", exc)

这个例子会打印 input 为 float64、weight 为 float32。不同 PyTorch 版本的最后一句错误可能不同,但这两个检查值足以解释此例的失败。

回到自己的工程,把 first = model[0] 和下面的检查放在失败调用前。如果模型不是 Sequential,改成堆栈中实际失败的层,例如 first = model.fc1;如果失败的是中间层,应打印送到该层的中间张量,而不是只看最初的图片。

NumPy 转成 Tensor,为什么还会留下 Double

torch.from_numpy 不会自动把 float64 降成 float32。上例明确创建了 float64 数组,转成 Tensor 后仍是 torch.float64;默认创建的浮点 Linear 权重通常是 torch.float32。

这里的 Float、Double 是类型名称,对应 float32、float64。不能根据“输入已经是 Tensor”判断类型一致,也不应根据打印出来的小数位数判断。

先读检查值,再选修复方向:

检查结果 应该处理的位置
输入 float64,权重 float32,项目按 float32 训练 在数据转换或进入模型前把特征转成 float32
输入 float64,模型有意按 float64 训练 把模型及其他浮点输入统一为 float64
两者 dtype 已一致,但设备不同 继续统一 device;这不是同一个类型问题
第一层检查一致,仍在后续层失败 到真正失败层前检查中间激活与该层权重

方案一:保留 float32 模型,转换特征

继续使用前面的示例,在前向前执行:

weight = model[0].weight
X_trainTensor = X_trainTensor.to(dtype=weight.dtype, device=weight.device)

对于明确采用 float32 的项目,也可以更早写成 X_train.astype(np.float32) 后再 from_numpy。这两种写法选择一处作为统一入口即可;训练集、验证集和测试集都应遵循相同规则。

注意 .float() 和 .to() 的返回值要接住。只写一行 X_trainTensor.float(),再把原变量送入模型,并没有替换后续使用的对象。

方案二:项目需要 float64,就转换模型

如果双精度是项目的明确要求,不要为了消除报错把输入降为 float32。改用下面这组代码;它是上一方案的替代方案:

model = model.to(dtype=torch.float64)
X_trainTensor = X_trainTensor.to(
    dtype=torch.float64, device=next(model.parameters()).device,
)

在创建优化器、恢复优化器状态之前确定模型类型更清楚。若还有自定义损失、其他浮点输入或手工创建的状态张量,也应按实际运算要求检查;不要只给某一层换类型,留下前后冲突。

不止验证前向,还要走完一个训练 step

任选上面一个方案后,继续运行这段示例。targets 是给四行示例数据配的合成二分类标签,不是原帖真实标注:

targets = torch.tensor([0, 1, 0, 1], dtype=torch.long,
                       device=next(model.parameters()).device)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
optimizer.zero_grad()
log_probs = model(X_trainTensor)
loss = nn.NLLLoss()(log_probs, targets)
assert log_probs.shape == (4, 2)
assert torch.isfinite(loss)
loss.backward()
assert model[0].weight.grad is not None
assert torch.isfinite(model[0].weight.grad).all()
optimizer.step()
print("output:", log_probs.shape, log_probs.dtype)
print("gradient finite:", bool(torch.isfinite(model[0].weight.grad).all()))

特征与模型统一为 float64 时,类别标签仍然是 long。这里 NLLLoss 使用每行一个类别索引,不能把所有张量一起转成 double。

回到真实数据后,再检查输出是否为 [样本数,2]、标签是否为同样数量的 0/1 编号。类型修复应同时保留模型精度要求和分类目标的含义。

参考:原始问题;torch.from_numpy(2.5)、Linear(2.5)、NLLLoss(2.5)。

相关文章
|
11天前
|
Linux 开发工具 iOS开发
Codex保姆级教程(下载+安装+登录+使用,含所有版本,2026最新)
Codex是OpenAI推出的开源AI编程智能体,本地运行,可理解整个代码库,支持自然语言指令改代码、执行命令、跑测试、修Bug,兼容Win/macOS/Linux。(239字)
4153 22
|
11天前
|
JavaScript API iOS开发
DeepSeek Harness下载、安装、配置一篇搞定(2026整理,送常用插件)
DeepSeek Harness(DSH)是DeepSeek于2026年开源的MIT协议AI Agent框架,支持插件化组装模型、工具、沙箱与UI,兼容主流大模型。本文提供免Node.js的桌面端安装包(Win/macOS),含详细图文教程及热门插件推荐。
4210 49
|
6天前
|
存储 弹性计算 人工智能
2026 年阿里云双十一活动入口攻略,新客服务器优惠通道、三大会场入口梳理
综合来看,2026年阿里云双十一活动入口清晰: 阿里云轻量应用服务器、阿里云ECS云服务器、阿里云GPU云服务器、阿里云百炼大模型服务平台 活动会场、综合权益中心、99计划专场三大入口覆盖服务器、AI权益与续费特价;新用户通过控制台首页banner、权益中心、产品页三处路径进入专属专场,老用户通过控制台弹窗和费用中心权益中心进入老客专区,企业用户做企业实名后解锁专属满减与阶梯折扣。
821 0
|
12天前
|
iOS开发 Docker MacOS
【2026实测】Docker Desktop下载、安装、汉化、配置教程(附官网安装包)
Docker Desktop 是 Docker 官方推出的桌面容器管理工具,集成引擎、CLI、图形界面与 Kubernetes,支持 Win/macOS/Linux。2026 最新版 4.88.1 强化 ARM 原生运行、镜像加速及资源可视化,附中文汉化与国内镜像配置指南。
2024 7
|
6天前
|
云安全 人工智能 安全
|
5天前
|
Linux 开发工具 iOS开发
2026最新codex下载安装保姆级使用教程(下载+安装+登录+使用,含所有历史版本)
本文详解OpenAI Codex国内快速上手指南:提供Win/macOS/Linux全平台免安装包、npm/Homebrew等多方式安装、账号/API Key双登录、简体中文切换,覆盖下载、安装、汉化、使用及高频避坑(如微软商店失败、npm超时等),10分钟即可跑通。
1162 3
|
12天前
|
安全 算法 定位技术
《高性价比人生指南》完整原版:普通人用最少的资源,过好这一生的底层逻辑~How To Live Better
📖《高性价比人生指南》是一份基于实证、拒绝焦虑的生存手册,倡导以“人生时薪”为视角,重新计算时间、金钱与精力的成本与收益。它不承诺逆袭,只教人算清账:省下的钱若耗掉时间便亏;买体验比买物品更值;睡眠是最高杠杆的健康投资;关系贵在情绪价值而非表面热络;学习重在改变行为而非自我安慰。核心理念:用低成本、高回报的微小行动,换取长期的选择权——不是成为谁,而是掌控自己人生的主动权。
2149 6
|
云安全 安全 网络安全
|
3天前
|
人工智能 安全 API
DeepSeek Harness下载、安装、配置一篇搞定(2026整理,送常用插件)
DeepSeek Harness(dsh)是DeepSeek AI于2026年开源的轻量级Agent运行框架,基于Cordis内核,践行“一切皆插件”理念。支持Web/桌面双端,开箱即用;内置多模型接入、丰富插件生态(超3.5万),适配编程、办公、创作等场景。(239字)
765 0

热门文章

最新文章