Python PyTorch:';“无交叉熵”;对象没有属性';项目';
目前正在部署CNN模型Python PyTorch:';“无交叉熵”;对象没有属性';项目';,python,python-3.x,neural-network,pytorch,cnn,Python,Python 3.x,Neural Network,Pytorch,Cnn,目前正在部署CNN模型 model = CNN(height=96, width=96, channels=3) 并观察其交叉熵损失 criterion = nn.CrossEntropyLoss() 培训师课程如下: class Trainer: def __init__( self, model: nn.Module, train_loader: DataLoader, val_loader: DataLoader, criterion: nn.M
model = CNN(height=96, width=96, channels=3)
并观察其交叉熵损失
criterion = nn.CrossEntropyLoss()
培训师课程如下:
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'
回溯(最近一次呼叫最后一次):
文件“/Users/xyz/main.py”,第316行,在
main(parser.parse_args())
文件“/Users/xyz/main.py”,第128行,在main中
log\u frequency=args.log\u frequency,
文件“/Users/xyz/main.py”,第198行,列车中
self.log\u度量(历元、精度、损耗、数据加载时间、步长时间)
日志度量中的文件“/Users/xyz/main.py”,第232行
{“火车”:浮动(损失项目)},
文件“/Users/xyz/main.py”,第585行,在__
类型(自我)。\uuuuu名称(自我,名称))
AttributeError:“CrossEntropyLoss”对象没有属性“item”
它看起来像调用self中的损失。日志度量(历元、精度、损失、数据加载时间、步长时间)
是标准本身(CrossEntropyLoss对象),而不是调用它的结果
您的训练循环需要调用标准来计算损失,我在您提供的代码中没有看到它。您的代码甚至从未计算过损失
,因此不清楚这里发生了什么。您需要提供一个完整的可复制示例。另外,你应该提供完整的错误回溯。你能告诉我你所说的“可复制的例子”是什么意思吗?谢谢你的指导。我在复制堆栈上的代码时忽略了这一点。谢谢你让我知道。损失=自我标准在列车功能中。但是错误仍然存在,应该类似于loss=self.criteria(预测标签,预期标签)
。正如我所说,loss
必须是调用Criteria函数的结果,而不是函数本身。