我在医学影像公司工作,其中我有130个病人卷,每卷由N数量的DICOM图像/切片组成。
问题是在卷之间,片N的数量是不同的。
大部分,50%的卷有20片,其余的有3或4片,有些甚至超过10片(如此之多以至于无法在卷之间进行插值以使切片数相等)
我可以将Conv3d用于卷之间深度N (片数)相同的卷,但我必须为分类任务使用整个数据集。那么,如何整合整个数据集并将其提供给我的网络模型呢?
发布于 2020-01-14 19:16:06
如果我理解你的问题,你有130个三维图像,你需要输入一个三维ConvNet。我假设您的批次,如果N对所有数据是相同的,将是形状张量(batch_size,channels,N,H,W),而您的问题是N在不同的数据样本之间是不同的。
所以有两个问题。首先,您的模型需要处理N值不同的数据的问题,其次,还有一个与实现相关的不同长度的数据批处理问题。
这两个问题都出现在视频分类模型中。首先,我不认为有什么方法可以绕过在模型中的某个地方插值(除非您愿意填充/剪切/取样) --如果您正在执行任何类型的分类任务,那么您非常需要在分类头上设置一个固定大小的层。然而,插值并不是在一开始就发生的。例如,如果对于一个大小的输入张量(批处理,3,20,256,256),您的网络conv池下降到(批处理,1024,4,1,1),那么您可以在输出之前执行一个自适应池(例如https://pytorch.org/docs/stable/nn.html#torch.nn.AdaptiveAvgPool3d),以便在预测之前将更大的数据降到该大小。
另一个选项是填充和/或截断和/或重采样图像,以便所有数据都是相同的长度。对于视频,有时人们通过循环帧来填充,或者你可以用0来填充。什么是有效的取决于你的长度轴是代表时间,还是其他东西。
对于第二个问题,批处理:如果您熟悉pytorch的dataloader/dataset管道,您将需要编写一个自定义collate_fn,它接受dataset对象的输出列表,并将它们放在一个批处理张量中。在这个函数中,您可以决定是填充还是截断,或者其他什么,这样就可以得到一个正确形状的张量。不同的批可以有不同的值N。实现这条管道的一个简单例子是:https://github.com/yunjey/pytorch-tutorial/blob/master/tutorials/03-advanced/image_captioning/data_loader.py
其他可能有助于批处理的方法是根据数据的N维将数据放入存储桶中。这样,你就可以避免大量不必要的填充。
发布于 2020-01-13 17:54:13
你需要把数据集压平。你可以把每个单独的切片作为CNN的输入。您可以将每个变量设置为布尔标志Yes / No,如果是绝对的,或者如果是数字的,则可以将输入设置为none的等效值(通常为0)。
https://stackoverflow.com/questions/59721052
复制相似问题