1
今天是2025.2.19,我开始今天的学习,为了提高学习效率,直到吃晚饭前我不玩手机,不看小说,每学25分钟可以玩一把炉石传说竞技场。另外我的自行车坏了,今天要尽量修好。
2
昨天我把混淆矩阵搞定了,基于混淆矩阵的概念,提出了敏感度和特异度,敏感度就是正确的样本被正确的预测概率,即为正确的样本被正确预测/(正确的样本被正确预测+错误的样本被正确预测),也就是TP(T代表预测对了,P代表结果为正),TN(T代表预测对了,N代表结果为负类),FN(F代表预测错了,N代表预测的为负类),FP(F代表预测错了,P代表预测的为正类)
那么TP/TP+FN就是敏感度,TN/TN+FP就是特异度。
3
self.logger.info(" | ".join([
f'Epoch[{epoch}/{self.epochs}]',
f'Train Loss:{self.train_loss.avg: .3f}',
f'Train Accuracy:{self.train_accuracy.avg: .3f}%',
# f'Edges:{self.edges_num.avg: .3f}',
# f'Test Loss:{self.test_loss.avg: .3f}',
f'Val Accuracy:{self.val_accuracy.avg: .3f}%',
f'Test Accuracy:{self.test_accuracy.avg: .3f}%',
f'Val AUC:{val_result[0]:.2f}',
f'Test AUC:{test_result[0]:.4f}',
f'Test SEN:{SEN:.4f}',
f'Test SPE:{SPE:.4f}'
]))
我说这一大串是啥啊,原来就是result里面的日志信息。logger.info就是把小括号里面的内容保存在日志里。" | "就是把这些不同的日志信息通过|分隔开。
这些日志信息从上到下依次为第几轮,损失函数,训练准确度,验证准确度,测试准确度,以及AUC,AUC其实就是判断对的结果/总结果,也是判断模型性能的一个指标。感觉AUC和SEN,SPE的功能有点重复。
4
txt += f'Epoch[{epoch}/{self.epochs}] '+f'Train Loss:{self.train_loss.avg: .3f} '+f'Train Accuracy:{self.train_accuracy.avg: .3f}% '+f'Val Accuracy:{self.val_accuracy.avg: .3f}% '+f'Test Accuracy:{self.test_accuracy.avg: .3f}% '+f'Val AUC:{val_result[0]:.3f} '+f'Test AUC:{test_result[0]:.4f}'+f'Test SEN:{SEN:.4f}'+f'Test SPE:{SPE:.4f}'+'\n'
training_process.append([self.train_accuracy.avg, self.train_loss.avg,
self.val_loss.avg, self.test_loss.avg]
+ val_result + test_result)
看一下这段,txt里面保存的内容倒是挺多的,training_process本身就是列表,还存储了若干个列表,存储了训练集的平均准确率,平均损失,测试集的平均损失
5
now = datetime.now()
date_time = now.strftime("%m-%d-%H-%M-%S")
self.save_path = self.save_path/Path(f"{self.best_acc: .3f}%_{date_time}")
if self.save_learnable_graph:
self.generate_save_learnable_matrix()
self.save_result(training_process, txt)
我以前看不懂那个结果,
现在我理解了,在strfime的用法中month就是月,day就是天,hour就是小时,minute就是分钟,second就是秒。像我这个运行的结果就是1月28号14点8分8秒。下面那个/是一个拼接符,把最优准确率和时间拼一块。
6
train函数其实我看懂了,就是一些小函数我还需要再看看
def train_per_epoch(self, optimizer):
self.model.train()
for data_in, pearson, label, pseudo in self.train_dataloader:
label = label.long()
data_in, pearson, label, pseudo = data_in.to(
device), pearson.to(device), label.to(device), pseudo.to(device)
inputs, nodes, targets_a, targets_b, lam = mixup_data(
data_in, pearson, label, 1, device)
[output, score], learnable_matrix, edge_variance = self.model(inputs, nodes, pseudo)
loss = 2 * mixup_criterion(
self.loss_fn, output, targets_a, targets_b, lam)
if self.group_loss:
loss += mixup_cluster_loss(learnable_matrix,
targets_a, targets_b, lam)
# loss += 0.001*topk_loss(score, self.pool_ratio)
self.train_loss.update_with_weight(loss.item(), label.shape[0])
optimizer.zero_grad()
loss.backward()
optimizer.step()
top1 = accuracy(output, label)[0]
self.train_accuracy.update_with_weight(top1, label.shape[0])
self.edges_num.update_with_weight(edge_variance, label.shape[0])
这段代码确实有点晦涩难懂