Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 构建从3D图像加载(未知数量)切片的PyTorch数据集的好方法是什么?_Python_Dataset_Pytorch_Dataloader - Fatal编程技术网

Python 构建从3D图像加载(未知数量)切片的PyTorch数据集的好方法是什么?

Python 构建从3D图像加载(未知数量)切片的PyTorch数据集的好方法是什么?,python,dataset,pytorch,dataloader,Python,Dataset,Pytorch,Dataloader,我正在尝试构建一个PyTorch数据集,该数据集返回形状为?x512x512的三维图像的21x512x512切片。我知道有多少图像,但我不知道每个图像中有多少个切片。因此,我会直观地让数据集的\uuu len\uuu()函数返回我拥有的图像总数。我可以事先从技术上检查所有图像的形状,但数据集可能会随着时间的推移而变化,因此我更喜欢可伸缩的软件解决方案 有了这个,我需要一些功能,将图像分割成片(上面提到的大小),并返回这些片,而不是整个图像。这也不是问题,我有一个函数可以做到这一点 问题来了。如果

我正在尝试构建一个PyTorch数据集,该数据集返回形状为
?x512x512
的三维图像的
21x512x512
切片。我知道有多少图像,但我不知道每个图像中有多少个切片。因此,我会直观地让数据集的
\uuu len\uuu()
函数返回我拥有的图像总数。我可以事先从技术上检查所有图像的形状,但数据集可能会随着时间的推移而变化,因此我更喜欢可伸缩的软件解决方案

有了这个,我需要一些功能,将图像分割成片(上面提到的大小),并返回这些片,而不是整个图像。这也不是问题,我有一个函数可以做到这一点

问题来了。如果我在数据集的
\uuu getitem\uuuu()
函数中添加此切片功能,那么每个图像只会获得一个切片,因为PyTorch数据加载器会认为存在
len(数据集)
数据点,现在不再是这样了。但我也不能指定正确的样本数量,因为我事先不知道

我尝试了一些解决方案:

  • \uuuu getitem\uuuuu()
    中返回一个生成器函数,该函数为每个图像生成切片。这不起作用,因为
    \uu getitem\uuu()
    需要返回类型为
    列表
    元组
    张量
    等的内容
  • 只需返回整个图像,并在列车循环中分解它。这可以工作,但编程风格不好(因为我想在数据集中隐藏数据选择),并且与数据加载程序的批处理不太兼容,因为一个图像可能有100个切片,而另一个图像可能只有5个切片。在这种情况下,从这些图像生成批次将导致只有5个批次具有实际的
    批次大小
    ,另外95个批次具有较少的每批次样本。解决这一问题需要进行一些丑陋的检查,以查看是否需要加载另一个图像,我再次希望将其隐藏在数据集中
  • 在数据集的
    \uuu getitem\uuuuuu()
    函数中产生
    for
    循环。这与第1点的原因不同:无法在数据集中返回生成器

  • 简而言之,从PyTorch数据集中的3D图像中加载未知数量的切片的干净方法是什么?

    为什么不提前计算切片的数量?因为这是一个可能随时间变化的相当大的数据集。这并不是不可能做到的(并且在添加新数据时重做),但我更喜欢可扩展的软件解决方案。好的一点,我会更新这个问题。对我来说,这是一个很好的例子