pytorch训练数据类型错误

本文讲述了如何在PyTorch中处理数据类型不匹配导致的RuntimeError,通过将输入转换为float32并调整y值标签为long类型,确保模型训练顺利。作者分享了解决过程及关键代码片段,附带了相关IPynb链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RuntimeError: expected scalar type Long but found Float
先了解一个知识:torch.Tensor默认是torch.FloatTensor是32位浮点类型数据,torch.LongTensor是64位整型。
读取pandas数据后,在进行分类处理时,都是默认给定的torch.Tensor,如下:

X_train = torch.tensor(X_train.values)
y_train = torch.tensor(y_train.values)

X_test = torch.tensor(X_test.values)
y_test = torch.tensor(y_test.values)

这个默认是根据X_train.values和y_train.values的数据类型来的,

X_train.dtype为torch.int64
y_train.dtype为torch.int64

我们再看看模型的权重值的类型:

for name, param in model.named_parameters():
    print(name,'-->',param.type(),'-->',param.dtype,'-->',param.shape)

结果:

linear_relu_stack.0.weight --> torch.FloatTensor --> torch.float32 --> torch.Size([512, 784])
linear_relu_stack.0.bias --> torch.FloatTensor --> torch.float32 --> torch.Size([512])
linear_relu_stack.2.weight --> torch.FloatTensor --> torch.float32 --> torch.Size([512, 512])
linear_relu_stack.2.bias --> torch.FloatTensor --> torch.float32 --> torch.Size([512])
linear_relu_stack.4.weight --> torch.FloatTensor --> torch.float32 --> torch.Size([10, 512])
linear_relu_stack.4.bias --> torch.FloatTensor --> torch.float32 --> torch.Size([10])

可以看出权重值的类型是float32,所以这里有两个问题需要解决:
第一、把输入的数据类型变为float32的;
第二、把y值标签变为64位整型。
所以修改代码如下:

X_train = torch.tensor(X_train.values,dtype=torch.float)
y_train = torch.LongTensor(y_train.values)

X_test = torch.tensor(X_test.values,dtype=torch.float)
y_test = torch.LongTensor(y_test.values)

再看看此时的值:

X_train.dtype为torch.float32
y_train.dtype为torch.int64

这样模型就能跑通了。
如图:
在这里插入图片描述
对应的ipynb代码链接:https://gitee.com/rengarwang/pytorch-coding/blob/master/pytorch_pandas_test.ipynb

### PyTorch 训练大型模型的最佳实践和技术 #### 资源管理与优化配置 对于大规模模型训练而言,资源的有效利用至关重要。为了提高效率并减少成本,在启动训练之前应仔细规划硬件资源配置。GPU 是加速深度学习计算的关键组件之一;因此,选择合适的 GPU 类型和数量可以显著影响性能[^1]。 ```python import torch device = "cuda" if torch.cuda.is_available() else "cpu" model.to(device) ``` #### 数据加载器设置 构建高效的数据管道能够极大提升整体吞吐量。通过使用 `DataLoader` 和多线程读取数据样本,可以在不阻塞主线程的情况下完成批量处理工作。此外,适当调整批大小(batch size),使得每批次输入既不会因为过小而浪费显存空间也不会由于过大而导致溢出错误[^2]。 ```python from torch.utils.data import DataLoader, Dataset class CustomDataset(Dataset): def __init__(self, ...): ... train_loader = DataLoader( dataset=CustomDataset(...), batch_size=32, shuffle=True, num_workers=8 # 根据CPU核心数设定 ) ``` #### 权重初始化策略 良好的权重初始值有助于加快收敛速度以及改善最终效果。Xavier 或 Kaiming 初始化方法被广泛应用于各种网络结构之中,特别是当激活函数为 ReLU 及其变体时推荐采用后者[^4]。 ```python def init_weights(m): if isinstance(m, nn.Linear) or isinstance(m, nn.Conv2d): nn.init.kaiming_normal_(m.weight) model.apply(init_weights) ``` #### 学习率调度机制 动态调节学习速率是克服局部极小值陷阱的重要手段之一。常见的做法是在一定轮次之后逐步降低原有水平直至达到预定阈值停止更新参数。Cosine Annealing Scheduler 就是一种有效的方案,它能够在整个迭代过程中平滑地改变LR曲线从而促进全局最优解搜寻过程。 ```python optimizer = torch.optim.Adam(model.parameters(), lr=0.001) scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=epochs) for epoch in range(epochs): train(...) scheduler.step() ``` #### 模型保存与恢复功能 定期备份当前状态以便于后续继续训练或是部署上线是非常必要的操作。借助 PyTorch 提供的 API ,只需几行代码即可实现这一目标。同时建议记录下每次 checkpoint 的时间戳及相关超参信息方便日后追溯版本差异[^3]。 ```python torch.save({ 'epoch': epoch, 'model_state_dict': model.state_dict(), 'optimizer_state_dict': optimizer.state_dict(), }, PATH) checkpoint = torch.load(PATH) model.load_state_dict(checkpoint['model_state_dict']) optimizer.load_state_dict(checkpoint['optimizer_state_dict']) epoch = checkpoint['epoch'] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值