【发布时间】: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