You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义Data Loader与LSTM集成时数据类型不匹配RuntimeError解决

解决LSTM与自定义DataLoader集成时的mat1 and mat2 must have the same dtype错误

这个错误的核心原因是模型参数的数据类型与DataLoader输出的输入数据类型不匹配,比如模型默认用float32,但输入数据是float64,或者反过来。以下是具体解决方法:

1. 统一输入数据与模型的数据类型

  • 在Dataset层面处理:在自定义Dataset的__getitem__方法中,直接将数据转换为与模型一致的类型(通常是torch.float32):
    def __getitem__(self, idx):
        # 原有获取x、y的逻辑
        x = torch.tensor(x, dtype=torch.float32)
        y = torch.tensor(y, dtype=torch.float32)
        return x, y
    
  • 在训练循环中处理:如果无法修改Dataset,就在遍历DataLoader时转换输入类型:
    for batch_x, batch_y in dl:
        # 转换为模型使用的类型,比如float32
        batch_x = batch_x.to(torch.float32)
        batch_y = batch_y.to(torch.float32)
        # 后续训练逻辑
    

2. 调整模型的数据类型

如果输入数据的类型是你需要保留的(比如float64),可以将模型参数转换为对应类型:

# 将模型转换为float64类型
model = model.to(torch.float64)

3. 确保损失函数输入类型一致

计算损失前,确保标签batch_y的类型与模型输出outputs的类型匹配:

outputs = model(batch_x)
# 同步标签与输出的类型
batch_y = batch_y.to(outputs.dtype)
loss = criterion(outputs, batch_y)

修改后的完整训练循环示例

num_epochs = 10

# 先统一模型数据类型(以float32为例)
model = model.to(torch.float32)

for epoch in range(num_epochs):
    model.train()
    for batch_x, batch_y in dl:
        # 转换输入数据类型匹配模型
        batch_x = batch_x.to(torch.float32)
        batch_y = batch_y.to(torch.float32)
        
        optimizer.zero_grad()
        outputs = model(batch_x)
        loss = criterion(outputs, batch_y)
        loss.backward()
        optimizer.step()

内容的提问来源于stack exchange,提问作者Aneyasha Sarkar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 15:43:09