Pytorch 将CNN与卷之间具有不同深度的数据集一起使用

Pytorch 将CNN与卷之间具有不同深度的数据集一起使用,pytorch,conv-neural-network,dicom,Pytorch,Conv Neural Network,Dicom,我正在处理医学图像,其中我有130个患者卷,每个卷由N个DICOM图像/切片组成 问题是卷之间的切片数不同 大多数情况下,50%的体积有20个切片,其余的变化为3或4个切片,有些甚至超过10个切片(如此之多以至于无法通过插值使体积之间的切片数相等) 我能够将Conv3d用于深度N(切片数)在卷之间相同的卷,但我必须为分类任务使用整个数据集。那么,我如何整合整个数据集并将其提供给我的网络模型呢 您需要展平数据集。你可以把每一个片段都当作CNN的输入。您可以将每个变量设置为布尔标志Yes/No(如果

我正在处理医学图像,其中我有130个患者卷,每个卷由
N
个DICOM图像/切片组成

问题是卷之间的切片数不同

大多数情况下,50%的体积有20个切片,其余的变化为3或4个切片,有些甚至超过10个切片(如此之多以至于无法通过插值使体积之间的切片数相等)


我能够将Conv3d用于深度
N
(切片数)在卷之间相同的卷,但我必须为分类任务使用整个数据集。那么,我如何整合整个数据集并将其提供给我的网络模型呢

您需要展平数据集。你可以把每一个片段都当作CNN的输入。您可以将每个变量设置为布尔标志Yes/No(如果是分类的),或者如果是数字的,则可以将输入设置为none的等效值(通常为0)

如果我理解你的问题,你有130个三维图像,你需要把它们输入到一个三维网络中。我假设你的批次,如果N对于你所有的数据都是相同的,那么它就是形状张量(批次大小,通道,N,H,W),你的问题是你的N在不同的数据样本之间变化

所以有两个问题。首先,您的模型需要处理具有不同N值的数据,这是一个问题。其次,与实现更相关的问题是对不同长度的数据进行批处理

这两个问题都出现在视频分类模型中。首先,我不认为有什么办法可以避免在模型中的某个地方插入(除非你愿意填充/剪切/采样)——如果你在做任何类型的分类任务,你几乎需要在分类头上有一个固定大小的层。然而,插值并没有在一开始就发生。例如,如果对于大小为(batch,3,20,256,256)的输入张量,您的网络conv池降到(batch,1024,4,1,1),则您可以在输出之前执行自适应池(例如),以在预测之前将所有较大的内容降到该大小

另一个选项是填充和/或截断和/或重新采样图像,以便所有数据长度相同。对于视频,有时人们通过循环帧来填充,或者你可以用零填充。什么是有效的取决于你的长度轴是代表时间,还是其他什么

对于第二个问题,批处理:如果您熟悉pytorch的数据加载器/数据集管道,则需要编写一个自定义的collate\u fn,它获取数据集对象的输出列表,并将它们堆叠到批处理张量中。在这个函数中,您可以决定是填充还是截断或其他任何操作,从而得到正确形状的张量。不同的批次可以有不同的N值。实现此管道的一个简单示例如下:


另一个可能有助于批处理的方法是根据数据的N维将数据放入存储桶中。这样,您就可以避免大量不必要的填充。

您能详细说明一下吗?特别是,如果展平数据集,我将如何分配标签?您能提供示例数据结构吗?会更容易解释谢谢你!!这就是我计划要做的,我将把深度为n的3D数组存储到一个.npy numpy数组文件中,这样每个.npy数组
[3D array with the same depth n]
将成为第k批,然后我将不得不编写一个自定义的校对。