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

PyTorch Lightning训练器配置错误:解决'int'无'float'属性问题

错误排查与修复方案

核心错误原因

AttributeError: 'int' object has no attribute 'float' 是因为batch数据解析完全错误:
在training_step和错误命名的validation_step_outputs方法中,你错误地将batch_idx(整数类型的批次索引)赋值给了label变量,随后调用label.float()时自然报错——整数对象没有float()方法。

具体修复点

  • 修正batch解析逻辑:batch本身是包含图像和标签的元组((x_ray, label)),正确解析应为x_ray, label = batch,而非把batch和batch_idx强行赋值给变量。
  • 修正验证方法名:PyTorch Lightning的验证步骤必须用validation_step作为方法名,你写成了validation_step_outputs,会导致框架无法识别验证逻辑。
  • 修正epoch指标计算逻辑:原代码中直接调用self.training_step()获取步骤输出的写法完全错误,需通过实例变量存储步骤loss,再在epoch结束时计算平均值。
  • 对齐损失函数的张量设备:pos_weight张量需与模型同设备,避免后续出现设备不匹配错误。

完整修正代码

import torch
import torchvision
import pytorch_lightning as pl
from torchmetrics import Accuracy

class PneumoniaModel(pl.LightningModule):
    def __init__(self):
        super().__init__()
        self.model = torchvision.models.resnet18()
        # 替换第一层卷积为单通道输入(X光图像为单通道)
        self.model.conv1 = torch.nn.Conv2d(1, 64, kernel_size=(7,7), stride=(2,2), padding=(3,3), bias=False)
        # 替换全连接层为二分类输出
        self.model.fc = torch.nn.Linear(in_features=512, out_features=1, bias=True)

        self.optimizer = torch.optim.Adam(self.model.parameters(), lr=1e-4)
        # 确保pos_weight与模型同设备
        self.pos_weight = torch.tensor([3], device=self.device)
        self.loss_fn = torch.nn.BCEWithLogitsLoss(pos_weight=self.pos_weight)

        self.train_acc = Accuracy(task='binary')
        self.val_acc = Accuracy(task='binary')

        # 存储步骤loss用于计算epoch平均值
        self.train_losses = []
        self.val_losses = []

    def forward(self, data):
        return self.model(data)
  
    def training_step(self, batch, batch_idx):
        x_ray, label = batch
        label = label.float()
        pred = self(x_ray)[:, 0]
        loss = self.loss_fn(pred, label)

        self.train_losses.append(loss)
        self.log("Train_Loss", loss, prog_bar=True, logger=True)
        self.log("Train_ACC", self.train_acc(torch.sigmoid(pred), label.int()), prog_bar=True, logger=True)

        return loss

    def on_train_epoch_end(self):
        epoch_avg_loss = torch.stack(self.train_losses).mean()
        self.log("Train_Epoch_Avg_Loss", epoch_avg_loss, prog_bar=True, logger=True)
        self.train_losses.clear()

    def validation_step(self, batch, batch_idx):
        x_ray, label = batch
        label = label.float()
        pred = self(x_ray)[:, 0]
        loss = self.loss_fn(pred, label)

        self.val_losses.append(loss)
        self.log("Val_Loss", loss, prog_bar=True, logger=True)
        self.log("Val_ACC", self.val_acc(torch.sigmoid(pred), label.int()), prog_bar=True, logger=True)

    def on_validation_epoch_end(self):
        epoch_avg_loss = torch.stack(self.val_losses).mean()
        self.log("Val_Epoch_Avg_Loss", epoch_avg_loss, prog_bar=True, logger=True)
        self.val_losses.clear()

    def configure_optimizers(self):
        return [self.optimizer]

额外注意事项

  • 确保数据集输出单通道图像(1×H×W),否则第一层卷积会因通道数不匹配报错
  • 训练时需保持数据加载器的输出格式与模型步骤解析逻辑一致
  • TorchMetrics的binary任务Accuracy要求输入的预测值是经过sigmoid的概率(0-1),标签为整数类型(0/1),当前代码写法符合要求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 05:45:37