参考:
https://mp.weixin.qq.com/s/foB44Fm-IhX3yaawn_aZgg
数据预处理
几乎每个训练管道都以 Dataset 类开始。它负责提供数据样本。任何必要的数据转换和扩充都可能在此进行。简而言之,Dataset 能报告其规模大小以及在给定索引时,给出数据样本。
如果你要处理类图像的数据(2D、3D 扫描),那么磁盘 I/O 可能会成为瓶颈。为了获取原始像素数据,你的代码需要从磁盘中读取数据并解码图像到内存。每个任务都是迅速的,但是当你需要尽快处理成百上千或者成千上万个任务时,可能就成了一个挑战。像 NVidia 这样的库会提供一个 GPU 加速的 JPEG 解码。如果你在数据处理管道中遇到了 IO 瓶颈,这种方法绝对值得一试。
还有另外一个选择,SSD 磁盘的访问时间约为 0.08–0.16 毫秒。RAM 的访问时间是纳秒级别的。我们可以直接将数据存入内存。
建议 1:如果可能的话,将数据的全部或部分移至 RAM。
如果你的内存中有足够多的 RAM 来加载和保存你的训练数据,这是从管道中排除最慢的数据检索步骤最简单的方法。
class RAMDataset(Dataset):
def __init__(image_fnames, targets):
self.targets = targets
self.images = []
for fname in tqdm(image_fnames, desc="Loading files in RAM"):
with open(fname, "rb") as f:
self.images.append(f.read())
def __len__(self):
return len(self.targets)
def __getitem__(self, index):
target = self.targets[index]
image, retval = cv2.imdecode(self.images[index], cv2.IMREAD_COLOR)
return image, target
可以将每个文件的二进制内容保持不变,并在 RAM 中进行即时解码,或者对未压缩的图像进行讲解码,并保留原始像素。
标签:__,训练,解码,self,RAM,PyTorch,高性能,image,targets From: https://www.cnblogs.com/hsiangyu-meng/p/16929376.html