自定义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
相关产品推荐
相关产品推荐

