【问题标题】:PyTorch: 'CrossEntropyLoss" object has no attribute 'item'PyTorch:“CrossEntropyLoss”对象没有属性“项目”
【发布时间】:2021-03-08 19:07:23
【问题描述】:

目前正在部署一个 CNN 模型。

model = CNN(height=96, width=96, channels=3)

并希望观察其交叉熵损失。

criterion = nn.CrossEntropyLoss()

Trainer 类如下,

class Trainer:
def __init__(
    self,
    model: nn.Module,
    train_loader: DataLoader,
    val_loader: DataLoader,
    criterion: nn.Module,
    optimizer: Optimizer,
    summary_writer: SummaryWriter,
    device: torch.device,
):
    self.model = model.to(device)
    self.device = device
    self.train_loader = train_loader
    self.val_loader = val_loader
    self.criterion = criterion
    self.optimizer = optimizer
    self.summary_writer = summary_writer
    self.step = 0

def train(
        self,
        epochs: int,
        val_frequency: int,
        print_frequency: int = 20,
        log_frequency: int = 5,
        start_epoch: int = 0
):
    self.model.train()
    for epoch in range(start_epoch, epochs):
        self.model.train()
        data_load_start_time = time.time()
        for batch, labels in self.train_loader:
            batch = batch.to(self.device)
            labels = labels.to(self.device)
            data_load_end_time = time.time()
            loss=self.criterion
            logits=self.model.forward(batch)

            with torch.no_grad():
                preds = logits
                accuracy = compute_accuracy(labels, preds)

            data_load_time = data_load_end_time - data_load_start_time
            step_time = time.time() - data_load_end_time
            if ((self.step + 1) % log_frequency) == 0:
                self.log_metrics(epoch, accuracy, loss, data_load_time, step_time)
            if ((self.step + 1) % print_frequency) == 0:
                self.print_metrics(epoch, accuracy, loss, data_load_time, step_time)

            self.step += 1
            data_load_start_time = time.time()

        self.summary_writer.add_scalar("epoch", epoch, self.step)
        if ((epoch + 1) % val_frequency) == 0:
            self.validate()
            self.model.train()

记录损失的函数是,

    def log_metrics(self, epoch, accuracy, loss, data_load_time, step_time):
    self.summary_writer.add_scalar("epoch", epoch, self.step)
    self.summary_writer.add_scalars(
            "accuracy",
            {"train": accuracy},
            self.step
    )
    self.summary_writer.add_scalars(
            "loss",
            {"train": float(loss.item())},
            self.step
    )
    self.summary_writer.add_scalar(
            "time/data", data_load_time, self.step
    )
    self.summary_writer.add_scalar(
            "time/data", step_time, self.step
    )

我收到一个属性错误“'CrossEntropyLoss' 对象没有属性'item'”。我尝试删除几种方法,例如从代码的不同部分删除“item()”,并尝试不同类型的损失函数,如 MSELoss 等。 任何解决方案或方向将不胜感激。谢谢。

编辑-1:

这是错误回溯

Traceback (most recent call last):


 File "/Users/xyz/main.py", line 316, in <module>
main(parser.parse_args())
 File "/Users/xyz/main.py", line 128, in main
    log_frequency=args.log_frequency,
  File "/Users/xyz/main.py", line 198, in train
    self.log_metrics(epoch, accuracy, loss, data_load_time, step_time)
  File "/Users/xyz/main.py", line 232, in log_metrics
    {"train": float(loss.item)},
  File "/Users/xyz/main.py", line 585, in __getattr__
    type(self).__name__, name))
AttributeError: 'CrossEntropyLoss' object has no attribute 'item'

【问题讨论】:

  • 您的代码甚至从未计算过loss,因此不清楚这里发生了什么。您将需要提供一个完整可重现的示例。此外,您应该提供完整的错误回溯。
  • 你能告诉我你所说的“可重现的例子”是什么意思吗?谢谢你的指导。

标签: python python-3.x neural-network pytorch conv-neural-network


【解决方案1】:

看起来self.log_metrics(epoch, accuracy, loss, data_load_time, step_time) 调用中的loss 是标准本身(CrossEntropyLoss 对象),而不是调用它的结果。

您的训练循环需要调用标准来计算损失,我在您提供的代码中没有看到它。

【讨论】:

  • 我在堆栈上复制代码时错过了这一点。谢谢你告诉我。
  • loss = self.criterion 在 train 函数中。但错误仍然存​​在
  • 应该类似于loss = self.criterion(labels_predicted, labels_expected)。正如我所说,loss 必须是调用标准函数的结果,而不是函数本身。
猜你喜欢
  • 2018-05-09
  • 2022-06-11
  • 2021-10-26
  • 2019-07-16
  • 1970-01-01
  • 2015-09-16
  • 1970-01-01
  • 2021-10-28
  • 2020-11-09
相关资源
最近更新 更多