关于CNN的几个基本问​​题

数据挖掘 深度学习 图像分类 卷积 美国有线电视新闻网
2022-02-17 07:43:02

我正在尝试制作一个用于 3D 图像识别的 CNN,但预计所有内容都只有三分之一。在第一个时期,预测甚至很快收敛。我已经为此工作了一个星期,完全迷失了方向。
我有自己的几个猜测,为什么它总是收敛到一个类。

  1. 我的 3D 张量很大,为 40x35x30,并且有很多空白,因为我必须将我的对象放在立方体盒子中。这会有问题吗?
  2. 我只有约 5000 个用于训练的样本和约 500 个用于测试集的样本。我的样品太少了吗?
  3. 我的标签有 3 个类,大约 75% 的整个数据属于第 1 类。在第一个 epoch 期间,我的模型快速收敛,将 99% 的数据预测为该类。这种不平衡的数据会导致问题吗?
  4. 我的模型设计为
    conv1(kernel_size=10,stride=1,filter=32)-batch_norm1-maxpool1-conv2(8,1,64)-batch_norm2-maxpool2-conv3(8,1,64)-maxpool3-fc4( 1024)-batchnorm4-dropout4(20%)-fc5(384)-batchnorm5-dropout5(20%)-fc6(3)
    我在 -1 和 1 之间标准化了输入 我对卷积层使用了leaky-relu 激活。我使用衰减率为 0.99 的 Adam 优化器。
    首先,我不确定是否可以在每一层执行批量标准化。我是否错过了在这里设计 CNN 模型的任何重要概念?
  5. 或者也许我的数据很糟糕。我有点怀疑我的数据彼此之间没有显着差异,而且根本没有模式。在这种情况下,是否有任何统计方法/模型来检查我的数据是否有有意义的差异?(3D 图像是 3D 空间中的一些化学/物理数据,我将其转换为 numpy 矩阵)

但我认为这更像是消失的问题,因为当我用 Xavier 的方式初始化变量时,到类 #1 的收敛速度较慢。请有人帮助我:(

2个回答
  1. 您很可能没有足够的神经网络训练数据。
  2. 您的班级不平衡问题可能是一个问题。而不是使用精度作为测量尝试某种类型的 F 分数。
  3. 批量归一化应该应用在卷积层和激活函数之间。
  4. 如果你认为你有一个消失或消亡的激活问题,请绘制梯度或梯度之和。如果你是对的,它会给你一个想法。

这是我对你的每一个观点的看法。

  1. 您的数据非常稀疏。您是否将这些数据最佳地存储在稀疏对象中,例如,如果您使用 Keras,则存储在 csr 稀疏矩阵中?这比准确性更可能影响训练时间,但需要考虑。
  2. 5000 个训练样例和 500 个测试样例对我来说听起来不错,只是你的数据可能太少而无法适应你拥有的模型类型(你可能严重欠拟合)。尝试一个更简单的模型,看看你是否可以用它来改进结果(尝试一些愚蠢的简单的东西,比如一层 MLP,看看会发生什么)。
  3. 这似乎是最有可能的问题。我的第一个猜测是这与不平衡的类有关。如果您使用准确度之类的指标来评估每个时期的训练,我建议您改用average_precisionor roc_auc_scoreor之类的东西f1,所有这些都可以通过 scikit-learn 获得。如果您使用的是 Keras,也请尝试使用class_weights,这将使损失函数中代表性不足的类的权重更高,本质上使算法偏向于在平等的竞争环境中考虑代表性不足的类。如果您不使用 Keras,请尝试实施一些类似的类加权方案。
  4. 批量标准化现在不像以前那么流行了。值得尝试使用和不使用批处理规范化的架构,看看它是否提供了明显的好处。
  5. 是的,如果您的数据纯粹是随机的,那么您根本不会检测到信号。这又回到了第 2 点(尝试一个更简单的模型,看看您是否可以检测到一种模式)。您还可以尝试可视化您的一些示例,看看您是否可以直观地看到类之间的差异。

关于 Xavier 初始化,我认为这不是您所看到的效果的可能原因。当然,初始化的类型会影响结果,但根据您的描述,我强烈怀疑这是由于来自数据的信号太少或不平衡类问题。

希望有帮助!