pytorch排序耗时较多

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pytorch排序耗时较多相关的知识,希望对你有一定的参考价值。

PyTorch排序的耗时可能会受到多个因素的影响,例如数据集大小、排序算法、硬件性能等等。以下是一些可能的解决方案:

1. 使用合适的排序算法。PyTorch中提供了多种排序算法,例如torch.sort()和torch.argsort()函数。不同的算法耗时不同,可以根据实际情况选择合适的算法。

2. 优化硬件性能。如果硬件性能较差,可以考虑升级硬件或者使用更高效的计算平台,例如GPU或者TPU。

3. 减少数据集大小。如果排序的数据集较大,可以考虑使用分布式计算或者对数据进行采样等方法来减少数据集大小,从而降低排序耗时。

4. 使用多线程或者异步操作。PyTorch支持多线程和异步操作,可以利用这些机制来提高对排序操作的并行度和效率。

总之,要优化PyTorch排序的耗时,需要综合考虑多个因素,并根据实际情况选择合适的解决方案。
参考技术A pytorch排序耗时较多解决方法:
回答:1、尽量将jpg等格式的文件保存为bmp文件,可以降低排序解码时间;

2、dataloader函数中增加num_workers参数,该参数表示加载数据的线程数,建议设置为该系统中的CPU核心数,若CPU很强劲,而且内存很大,也可以考虑将该数值设置的更大一些,节省排序耗时。
此外观察一下GPU和CPU的内存占用是否在不断增加,看看是否需要清理缓存。
参考技术B 1 是的,pytorch排序确实会耗费较多时间。

2 这是因为pytorch排序算法的复杂度较高,需要进行多次比较和交换,所以会导致较大的时间开销。

3 可以尝试使用一些优化的技巧,如使用更高效的排序算法、减少数据量等方法来优化排序的耗时。
同时,也可以考虑使用GPU加速来提高排序的效率。
参考技术C 在pytorch中,排序一般需要消耗较多的时间,因为它需要遍历数据,并进行比较和交换,这些操作都需要更多的时间。此外,pytorch有一个更高效的排序算法——“快速排序”,它可以在较少的时间内完成排序。

PyTorch 数据增强耗时过长

【中文标题】PyTorch 数据增强耗时过长【英文标题】:PyTorch Data Augmentation is taking too long 【发布时间】:2020-02-27 13:55:01 【问题描述】:

对于涉及回归的任务,我需要训练我的模型从 RGB 图像生成密度图。为了增加我的数据集,我决定水平翻转所有图像。就此而言,我还必须翻转我的地面实况图像,并且我这样做了。

dataset_for_augmentation.listDataset(train_list,
                        shuffle=True,
                        transform=transforms.Compose([
                            transforms.RandomHorizontalFlip(p=1),
                            transforms.ToTensor(),
                            transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
                        ]),
                        target_transform=transforms.Compose([
                            transforms.RandomHorizontalFlip(p=1),
                            transforms.ToTensor()
                        ]),
                        train=True,
                        resize=4,
                        batch_size=args.batch_size,
                        num_workers=args.workers),

但问题是:出于某种原因,PyTorch transforms.RandomHorizo​​ntalFlip 函数仅将 PIL 图像(不允许使用 numpy)作为输入。所以我决定将类型转换为 PIL Image。

img_path = self.lines[index]

img, target = load_data(img_path, self.train, resize=self.resize)

if type(target[0][0]) is np.float64:
    target = np.float32(target)

img = Image.fromarray(img)
target = Image.fromarray(target)

if self.transform is not None:
    img = self.transform(img)
    target = self.target_transform(target)

return img, target

是的,这个操作需要大量的时间。考虑到我需要对数千张图像执行此操作,每批 23 秒(最多应该不到半秒)是不能容忍的。

2019-11-01 16:29:02,497 - INFO - Epoch: [0][0/152]  Time 27.095 (27.095)    Data 23.150 (23.150)    Loss 93.7401 (93.7401)

如果有任何建议可以加快我的增强过程,我将不胜感激

【问题讨论】:

【参考方案1】:

@Berriel 答案的更多补充。

水平翻转

您正在为Xy 图像使用transforms.RandomHorizontalFlip(p=1)。在您的情况下,使用p=1,这些转换将完全相同,但您错过了数据增强点,因为网络只会看到翻转的图像(而不仅仅是原始图像)。您应该选择低于 1 且高于 0 的概率(通常为 0.5),以获得图像版本的高度可变性。

如果是这种情况 (p=0.5),您可以肯定会发生这样一种情况:X 被翻转,y 没有。

我建议使用 albumentations 库,它是 albumentations.augmentations.transforms.HorizontalFlip 以相同的方式对两个图像进行翻转。

标准化

您可以找到 normalizationImageNet 手段,并且在那里也已经设置了标准。

缓存

此外,为了加快速度,您可以使用torchdata 第三方库(免责声明我是作者)。在您的情况下,您可以在磁盘上使用albumentationscache 将图像从PIL 转换为TensorNormalize,或者在使用torchdata 进行这些转换之后在RAM 图像中甚至更好,最后应用您的转换。这种方式将允许您仅在初始时期后将HorizontalFlips 应用于您的图像和目标,之前的步骤将被预先计算。

【讨论】:

谢谢,预先计算增强步骤是我最初的计划,但后来我迷失了这个特定的步骤。我一定会努力落实您的建议。 顺便说一句,我假设在 RandomHorizo​​ntalFlip 中将 p 设置为 1 是不正确的?我想了解为什么在这种情况下 x 和 y 的转换方式会有所不同。 @3yanlis1bos 更新了我关于翻转的答案。是的,您将获得完全相同的转换,但您不会以这种方式扩充数据集,因为 所有图像 会被翻转。增强通常会增加数据集的大小和它的可变性,在这里它会保持完全相同。 是的,这是我的错误。我希望通过这些转换来扩大我的数据集! :d 原来我要问的不是我的主要问题。这使您的回答更加有价值,谢谢。【参考方案2】:

您无需更改 DataLoader 即可执行此操作。你可以使用ToPILImage():

transform=transforms.Compose([
    transforms.ToPILImage(),  # check mode assumption in the documentation
    transforms.RandomHorizontalFlip(p=1),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])

无论如何,我会避免转换为 PIL。这似乎完全没有必要。如果你想翻转所有图像,那为什么不只使用 NumPy 来做呢?

img_path = self.lines[index]

img, target = load_data(img_path, self.train, resize=self.resize)

if type(target[0][0]) is np.float64:
    target = np.float32(target)

# assuming width axis=1 -- see my comment below
img = np.flip(img, axis=1)
target = np.flip(target, axis=1)

if self.transform is not None:
    img = self.transform(img)
    target = self.target_transform(target)

return img, target

然后从Compose 中删除transforms.RandomHorizontalFlip(p=1)。因为ToTensor(...) 也处理ndarray,所以你很高兴。

注意:我假设宽度轴等于 1,因为 ToTensor 期望它在那里。

来自docs:

转换 PIL 图像或 numpy.ndarray (H x W x C) ...

【讨论】:

嗨,我使用转换的目的是执行数据增强。换句话说,我同时需要翻转和未翻转的图像,因为我想将数据集的大小加倍。但现在我发现这并没有像我尝试的那样奏效。 ToPILImage 在我的情况下不起作用,因为我的目标是二维图像,它与 H x W x C 结构不匹配。 @3yanlis1bos 我不明白。在步骤t,您是否希望数据加载器同时提供翻转图像和原始图像(imgtarget)?告诉我。 @3yanlis1bos 你可能想要imgtarget 在时间步t。这就是通常进行增强的方式,网络看到原始示例一次,第二次转换案例,因此它不会过度拟合。您确定要同时提供两个版本,而不是像通常那样按顺序提供吗? @3yanlis1bos 完全正确 :) 并且您获得了不必存储 2 * 数据库的好处。

以上是关于pytorch排序耗时较多的主要内容,如果未能解决你的问题,请参考以下文章

最新翻译的官方 PyTorch 简易入门教程

python 在RNOR的pytorch中排序和未排序

pytorch加速加载方案

无缝整合PyTorch 0.4与Caffe2,PyTorch 1.0即将问世

pytorch模型文件pth详解

嵌入式学深度学习:1Pytorch框架搭建