【问题标题】:Accuracy remains constant at 58%准确度保持在 58%
【发布时间】:2022-08-20 12:11:19
【问题描述】:

我正在创建一个基于 CNN-LSTM 的模型,以使用 CT 扫描图像对颅内出血进行分类。我正在使用一个自定义数据生成器,它生成数组形状的 x (512, 512, 3) 和 y [1]。 这是一个二元分类。基于batch_size,图像将被馈送到整个网络并训练模型。
由于我使用的批量大小为 32,因此 x 的形状为 (32, 30, 512, 512, 3),y 的形状为 (32, 1),其中我使用 30 个切片作为时间图像。

model = Sequential()
model.add(TimeDistributed(Conv2D(64, (3, 3),  activation=\'relu\'),input_shape=(None,512, 512,3)))
model.add(TimeDistributed(MaxPooling2D(pool_size=(2, 2))))
model.add(TimeDistributed(Dropout(0.3)))
model.add(TimeDistributed(Conv2D(128, (3, 3), activation=\'relu\')))
model.add(TimeDistributed(MaxPooling2D(pool_size=(2, 2))))
model.add(TimeDistributed(Dropout(0.3)))
model.add(TimeDistributed(Conv2D(256, (3, 3), activation=\'relu\')))
model.add(TimeDistributed(MaxPooling2D(pool_size=(2, 2))))
model.add(TimeDistributed((Dropout(0.3))))
model.add(TimeDistributed(Conv2D(512, (3, 3), activation=\'relu\')))
model.add(TimeDistributed(MaxPooling2D(pool_size=(2, 2))))
model.add(TimeDistributed((Dropout(0.3))))
model.add(TimeDistributed(Conv2D(512, (3, 3), activation=\'relu\')))
model.add(TimeDistributed(MaxPooling2D(pool_size=(2, 2))))
model.add(TimeDistributed((Dropout(0.3))))
model.add(TimeDistributed(Flatten()))
model.add(TimeDistributed(Dense(512, activation=\'relu\')))
model.add(TimeDistributed(Dropout(0.3)))
model.add(Bidirectional(GRU(512,activation = \'relu\', kernel_regularizer=\'l2\')))  
model.add(Dense(1,activation=\'sigmoid\'))

#optim = RMSprop(learning_rate=0.00001)
model.compile(loss=\'binary_crossentropy\',
              #optimizer= SGD(lr=0.1), #momentum=0.9, decay=0.01),
              optimizer= Adam(lr=0.00001),
              #optimizer= Nadam(lr=0.001),
              metrics=[\'accuracy\'])

我正在对模型进行 5 个 epoch 的训练,但准确率似乎停留在 58%。 我使用上述架构创建了另一个仅使用 CNN 的模型,没有 LSTM 部分,并且能够获得接近 91% 的准确率。当我包含 LSTM 部分时,准确度似乎停滞不前,但每个时期的损失都会减少,如下所示。

Epoch 1/5
904/904 [==============================] - 1056s 1s/step - loss: 1.4925 - accuracy: 0.5827 - val_loss: 0.7267 - val_accuracy: 0.5938
Epoch 2/5
904/904 [==============================] - 1050s 1s/step - loss: 0.6946 - accuracy: 0.5837 - val_loss: 0.6776 - val_accuracy: 0.5950
Epoch 3/5
904/904 [==============================] - 1057s 1s/step - loss: 0.6801 - accuracy: 0.5836 - val_loss: 0.6763 - val_accuracy: 0.5944
Epoch 4/5
904/904 [==============================] - 1045s 1s/step - loss: 0.6793 - accuracy: 0.5836 - val_loss: 0.6770 - val_accuracy: 0.5944
Epoch 5/5
904/904 [==============================] - 1048s 1s/step - loss: 0.6794 - accuracy: 0.5836 - val_loss: 0.6745 - val_accuracy: 0.5969

下面是我的数据分布

这里可能的原因是什么?

  • 你是如何只使用 CNN 来解决这个问题的?在那种情况下,你对时间维度做了什么?
  • 不认为它是基于时间的数据..使用每个切片作为单独的数据,就像我们对任何基于 cnn 的图像分类所做的那样
  • 一个输入数据点的大小为[30, 512, 512, 3],这需要 3D 卷积,你是这样做的吗?
  • 我使用了 2d 卷积,其中输出将是 2d 矩阵
  • 如果目标是分类(对于哪个 CNN 应该没问题),目前还不清楚 LSTM 会增加什么价值。其次,你训练的 epoch 数量很少,在得出结论之前尝试训练网络几千个 epoch。在训练的初始阶段,准确率和损失不太可能同步变化。

标签: tensorflow keras deep-learning conv-neural-network lstm


【解决方案1】:

当您说其他方法产生更好的性能时,请说出这些方法。我觉得带有 LSTM 的 CNN 可能会很棘手......

请检查填充,步幅等。

在学习过程中添加 0.00001 的学习率将非常缓慢地收敛。

【讨论】:

  • 我尝试了从 0.01 到 0.00001 的学习率。没有不同
  • 我已经在问题中提到了。只使用没有 lstm 的 CNN 我得到了更好的结果。
【解决方案2】:

在调试此过程之前有很多问题 -

  1. 您的数据集是 2D 还是 3D 图像?
  2. 您的图像的尺寸是多少,您之前提到过,但是当您使用 2D 或 3D 格式的数据时,尺寸是多少?
  3. 您的数据是否包含任何时间成分,即一幅图像与另一幅图像之间是否存在任何关系?

    话虽如此,我认为如果您的数据集中的各个图像彼此不相关,那么我不明白为什么要使用 LSTM 或任何类型的循环架构。如果您有 3D 数据集,则使用 3D 卷积网络。 LSTM/RNN 用于对输入之间的时间依赖性进行建模,例如,下一个单词依赖于前一个单词时的句子。在您的情况下,LSTM 正在尝试对不存在的图像之间的一些关系进行建模,而这 30 个(这似乎是“时间”维度)图像中的信息正试图成为最终 LSTM 时间点的瓶颈用于分类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 2021-03-22
    • 2016-09-01
    • 1970-01-01
    相关资源
    最近更新 更多