上一篇文章讲了训练过程和tensorboard可视化,这一篇文章记录下训练指标和数据增强的东西。
五、肺癌检测-数据集训练 training.py model.py_wxyczhyza的博客-CSDN博客
一、目标
1. 记录精度、召回率、F1分数
2. 样本均衡和样本随机化
3. 数据增强
二、要点
1. 精度、召回率、F1分数
精度、召回率、F1分数概念可参考文章:
召回率,精确度,准确率,F1分数的区别_wxyczhyza的博客-CSDN博客
2. 样本均衡化和样本随机化
由于数据中肿瘤只占所有结节的极少数,直接训练时会导致模型被训练成偏向将结果预测为正常结节,所以要对样本进行平衡和随机化,避免某个batch中出现所有样本只有正常结节没有肿瘤。
具体步骤:将正样本放在pos_list中,负样本放在neg_list中,当调用dataset的getiem(index)时,计算这个index是正样本还是负样本,并从对应的pos_list或neg_list中索引对应的样本返回。
假设希望正常结节和肿瘤数量的比例ratio=2,当使用dataset的getitem通过下标索引样本时,希望得到的样本为:
数据集 索引 Index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 转换公式 |
肿瘤+ 正常- | + | - | - | + | - | - | + | - | - | + | |
pos_list索引 Index_P | 0 | 1 | 2 | 3 | Index_P = Index // (ratio+1) | ||||||
neg_list索引 Index_N | 0 | 1 | 2 | 3 | 4 | 5 | Index_N = Index -1- Index_P |
举例:当ratio_int=2, 输入dataset的index为101,则:
① 101/ (2+1) = 33.6...,不能被3整除,证明是一个负样本,它对应的正样本的索引Index_P=33
② 负样本的索引Index_N = 101 -1 - 33 = 67
书中部分代码如下:
# dsets.py __init__函数代码
# 正常结节
self.negative_list = [
nt for nt in self.candidateInfo_list if not nt.isNodule_bool
]
# 肿瘤
self.pos_list = [
nt for nt in self.candidateInfo_list if nt.isNodule_bool
]
# dsets.py def getitem()
if self.ratio_int:
pos_ndx = ndx // (self.ratio_int + 1)
if ndx % (self.ratio_int + 1): # 负样本
neg_ndx = ndx - 1 - pos_ndx
neg_ndx %= len(self.negative_list) # 求余数防止下标溢出
candidateInfo_tup = self.negative_list[neg_ndx]
else:
pos_ndx %= len(self.pos_list) # 求余数防止下标溢出
candidateInfo_tup = self.negative_list[pos_ndx]
else:
candidateInfo_tup = self.candidateInfo_list[ndx]