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

Using CNN with Dataset that has different depths between volumes

我正在处理 Medical Images,我有 130 个患者卷,每个卷包含 N 个 DICOM Images/slices。

问题是卷之间的切片数量 N 会有所不同。

大多数,50% 的卷有 20 个切片,其余的有 3 或 4 个切片,有些甚至超过 10 个切片(以至于不可能进行插值以使卷之间的切片数量相等)

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

您需要展平数据集。您可以将每个单独的切片视为 CNN 中的输入。您可以将每个变量设置为布尔标志是/否,如果是分类变量或数字变量,您可以将输入设置为等同于 none(通常为 0)。

如果我理解你的问题,你有 130 张 3 维图像,你需要将其输入 3D ConvNet。我假设你的批次,如果你的所有数据的 N 都相同,那么你的批次将是形状张量(batch_size,通道,N,H,W),你的问题是你的 N 在不同数据之间变化样品。

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

这两个问题都出现在视频分类模型中。首先,我认为没有办法绕过必须在模型中插入 SOMEWHERE(除非你愿意 pad/cut/sample)——如果你在执行任何类型的分类任务时,您几乎都需要在分类头部有一个大小不变的层。但是,插值并没有在一开始就发生。例如,如果对于大小为 (batch, 3, 20, 256, 256) 的输入张量,您的网络转换池缩小到 (batch, 1024, 4, 1, 1),那么您可以执行自适应池(例如https://pytorch.org/docs/stable/nn.html#torch.nn.AdaptiveAvgPool3d) 就在输出之前,在预测之前对所有大于该大小的内容进行下采样。

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

对于第二个问题,批处理:如果您熟悉 pytorch 的 dataloader/dataset 管道,您需要编写一个自定义 collate_fn,它获取数据集对象的输出列表,并且将它们堆叠在一起成为一个批量张量。在此函数中,您可以决定是填充还是截断或其他任何方式,以便最终得到正确形状的张量。不同的批次可以有不同的 N 值。这里有一个实现此管道的简单示例:https://github.com/yunjey/pytorch-tutorial/blob/master/tutorials/03-advanced/image_captioning/data_loader.py

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