成功获取到数据之后,我们需要将数据放到Pytorch里面去处理,我们需要将其转换成Dataset数据集,方便去使用相同的API。要转换成Dataset数据集需要实现两个方法,方法一:? ?方法二:
运行比较慢的话,需要加入缓存 的方法:
缓存部分
@functools.lru_cache(1,typed=True)
def getCt(series_uid):
? ? return Ct(series_uid)
@raw_cache.memoize(typed=True)
def getCtRawCandidate(series_uid,center_xyz,width_irc):
? ? ct = getCt(series_uid)
? ? ct_chunk,center_irc = ct.getCtRawCandidate(center_xyz,width_irc)
? ? return ct_chunk,center_irc
def _len_(self):
? ? return len(self.candidateInfo_list)
def _getitem_(self,ndx):
? ? candidateInfo_tup = self.candidateInfo_list[ndx]
? ??
? ? width_irc = (32,48,48)
? ? candidate_a,center_irc = getCtRawCandidate(candidateInfo_tup.series_uid,candidateInfo.center_xyz,width_irc)
? ??
? ? #转换为张量
? ? candidate_t = torch.from_numpy(candidate_a)
? ??
? ? #转换为浮点数
? ? cadidate_t = candidate_t.to(torch.float32)
? ??
? ? #进行升维
? ? cadidate_t = candidate_t.unsqueeze(0)
? ??
? ? #处理标注信息
? ? post_t = torch.tensor([not candidateInfo_tup.isNodule_boool,candidateInfo_tup.isNodule_boool],dtype=torch.long)
? ??
? ? #返回资源组
? ? return (candidate_t,post_t,candidateInfo_tup.series_uid,torch.tensor(center_irc))
使用Dataset提供的方案,将数据分割为数据集和验证集
class LunaDataset():
? ? def _init_(self,val_stride=0,isValSet_bool=None,series_uid=None):
? ? ? ? self.candidateInfo_list = copy.copy(getCandidateInfoList())
? ? ? ??
? ? ? ? if series_uid:
? ? ? ? ? ? self.candidateInfo_list = [x for in self.candidateInfo_list if x.series_uid == series_uid]
? ? ? ? ? ??
? ? ? ? #是否是验证集
? ? ? ? if isValSet_bool:
? ? ? ? ? ? # 增加异常捕获信息
? ? ? ? ? ? assert val_stride>0,val_stride
? ? ? ? ? ? # 返回验证集的步长信息,步长信息就是对验证集进行切分的
? ? ? ? ? ? self.candidateInfo_list = self.candidateInfo_list[::val_stride]
? ? ? ? ? ? assert self.candidateInfo_list
? ? ? ? # 如果不是验证集,就是训练集
? ? ? ? elif val_stride>0:
? ? ? ? ? ? del self.candidateInfo_list[::val_stride]
? ? ? ? ? ? assert self.candidateInfo_list
? ? ? ? ? ??
? ? ? ? log.info("(!r): {} {} samples".format(
? ? ? ? ? ? self,len(self.candidateInfo_list), "Validation" if isValSet_bool else "training"
? ? ? ??
? ? ? ? ))