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

