for iteration, batch in enumerate(tqdm_dataloader): user_idx, pos_idx, neg_idx = batch rep, user_pool = self.model(graph) user = rep[user_idx] + user_pool[user_idx] pos = rep[self.model.n_user + pos_idx] neg = rep[self.model.n_user + neg_idx] pos_preds = self.model.predict(user, pos) neg_preds = self.model.predict(user, neg) loss, losses = self.criterion(pos_preds, neg_preds, user, pos, neg) self.optimizer.zero_grad() loss.backward() self.optimizer.step() epoch_losses = [x + y for x, y in zip(epoch_losses, losses)] tqdm_dataloader.set_description('Epoch {}, loss: {:.4f}'.format(self.epoch, loss.item())) if self.scheduler is not None: self.scheduler.step() epoch_losses = [sum(epoch_losses)] + epoch_losses return epoch_losses
时间: 2024-04-20 07:22:52 浏览: 132
Improved_iteration _C语言_Improved_iteration_c++求积分_数值分析_
在这段代码中,是一个训练过程中的一个 epoch 的逻辑。
首先,使用 `enumerate` 函数迭代 `tqdm_dataloader`,返回迭代次数和每个批次的数据。
然后,从 `batch` 中解包得到 `user_idx`、`pos_idx` 和 `neg_idx`,表示当前批次中的用户、正样本和负样本的索引。
接下来,通过调用 `self.model(graph)` 方法,传入 `graph` 对象,获取模型的表示向量 `rep` 和用户池(user pool)的表示向量 `user_pool`。
然后,根据索引从 `rep` 中取出对应的用户向量 `user`、正样本向量 `pos` 和负样本向量 `neg`。
通过调用 `self.model.predict(user, pos)` 和 `self.model.predict(user, neg)`,分别得到正样本和负样本的预测结果 `pos_preds` 和 `neg_preds`。
接下来,调用 `self.criterion(pos_preds, neg_preds, user, pos, neg)` 方法,传入预测结果和实际数据,计算损失值和各个损失函数的值。
然后,调用 `self.optimizer.zero_grad()` 方法将模型参数的梯度置零,以便进行下一次反向传播。
接着,调用 `loss.backward()` 方法进行反向传播计算梯度。
然后,调用 `self.optimizer.step()` 方法更新模型参数。
通过迭代更新 `epoch_losses` 列表,将当前批次的损失值累加到 `epoch_losses` 中。
在 `tqdm_dataloader` 的描述信息中显示当前 epoch 的编号和损失值。
如果存在学习率调度器(scheduler),则调用 `self.scheduler.step()` 方法更新学习率。
最后,将 `epoch_losses` 列表中的各个损失值相加,并将总和作为第一个元素添加到 `epoch_losses` 列表的开头。
最后,返回 `epoch_losses` 列表,它包含了当前 epoch 中各个损失函数的累计损失值。
阅读全文