0

我目前正在尝试构建一个可以检测患者是否患有由 covid 引起的肺炎的 CNN,并且无论我更改什么参数,模型的准确率都保持在 49%/50%,所以它基本上没用,因为它与掷硬币。这是我的代码,我想我会尝试使用 VGG-16 模型。

from tensorflow.keras.optimizers import Adam
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Conv2D, MaxPool2D, GlobalAveragePooling2D
from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping
from keras.preprocessing.image import ImageDataGenerator

# Loading in the dataset
traindata = ImageDataGenerator(rescale=1/255)
trainingdata = traindata.flow_from_directory(
    directory="Covid-19CT/TrainingData",
    target_size=(224,224),
    batch_size=100,
    class_mode="binary")
testdata = ImageDataGenerator(rescale=1/255)
testingdata = testdata.flow_from_directory(
    directory="Covid-19CT/TestingData",
    target_size=(224,224),
    batch_size=100,
    class_mode="binary")

# Initialize the model w/ Sequential & add layers + input and output <- will refer to the VGG 16 model architecture
model = Sequential()

model.add(Conv2D(input_shape=(224,224,3),filters=64,kernel_size=(2,2),padding="same", activation="relu"))
model.add(Conv2D(filters=64, kernel_size=(3,3), padding="same", activation ="relu"))
model.add(MaxPool2D(pool_size=(2,2), strides=2))

model.add(Conv2D(filters=128, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=128, kernel_size=(3,3), padding="same", activation="relu"))
model.add(MaxPool2D(pool_size=(2,2), strides=2))

model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu"))
model.add(MaxPool2D(pool_size=(2,2), strides=2))

model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(MaxPool2D(pool_size=(2,2), strides=2))

model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(MaxPool2D(pool_size=(2,2), strides=2))

model.add(GlobalAveragePooling2D())
model.add(Dense(units=4096, activation="relu"))
model.add(Dense(units=4096, activation="relu"))
model.add(Dense(units=1000, activation="relu"))
model.add(Dense(units=1, activation="softmax"))

# Compile the model
model_optimizer = Adam(lr=0.001)
model.compile(optimizer=model_optimizer, loss=keras.losses.binary_crossentropy, metrics=['accuracy'])
# Add the callbacks
checkpoint = ModelCheckpoint(filepath="Covid-19.hdf5", monitor='val_acc', verbose=1, save_best_only=True, save_weights_only=False, mode='auto')
early = EarlyStopping(monitor='val_acc', min_delta=0, patience=50, verbose=1, mode='auto')
fit = model.fit_generator(steps_per_epoch=25, generator=trainingdata, validation_data=testingdata, validation_steps=10,epochs=10,callbacks=[checkpoint,early])

这总是给出:

纪元 1/10 6/25 [======>.......................] - ETA:1:22:37 - 损失: 7.5388 - 准确度:0.5083

<- 好吧,它总是给出一个非常差的准确性......

附加信息:

  • 数据集中的一些图像是 JPG 其他是 PNG(不确定这是否是罪魁祸首)
  • 该数据集有 2072 张用于训练 Covid CT 的图像和 2098 张用于训练 NonCovid CT 的图像
  • 该数据集有 576 张用于测试 Covid CT 的图像和 532 张用于测试 NonCovid CT 的图像
  • 文件结构如下所示: Covid19ModelImages -> 训练数据和测试数据 - 训练数据有 2 个子文件夹 Covid19CT 和 noncovid19 CT,测试数据也有 2 个子文件夹 Covid19CT 和 noncovid19CT
  • 另外:我是不是太不耐烦了?我从不让它跑过第一个 epoch,因为我只是假设它永远不会超过 50%,是不是模型会在下一个 epoch 上改进更多?

如果有人愿意提供帮助,或者如果您需要任何其他附加信息来帮助您更好地了解问题,请告诉我!

4

1 回答 1

0

由于您使用的是二元交叉熵,因此具有 1 个单位的密集层中的激活函数应该是“sigmoid”。由于您没有使用 GPU,因此每个 epoch 的训练时间非常长。要查看模型是否正常工作,您可能需要减少此时间。你能做的事情很少。尝试将图像大小减小到 128 x 128。对于 224 X 224,您有 50176 个像素要处理,而对于 128 X 128 图像,您需要处理 16384 个像素,因此您可以将计算量减少大约 3 倍。此外,您还有两个具有 4096 个单位的密集层. 这也是计算费用。它也可能导致过度拟合。最初在没有这些层的情况下尝试您的模型,看看它是如何执行的。我不喜欢提前停止,因为这是避免处理过度拟合问题的拐杖。如果您遇到过度拟合,请添加一个 dropout 层来帮助避免它。最后,我建议您使用可调整的学习率。回调 ReduceLROnPlateau 使这很容易做到。将其设置为监控验证损失。如果在“耐心”连续 epoch 数之后损失未能减少,您可以设置参数以将学习率降低一个因子<1。我通常使用因子=.5 和耐心=1。这也使您能够使用更大的初始学习率来加快收敛速度​​。文档是 这也使您能够使用更大的初始学习率来加快收敛速度​​。文档是 这也使您能够使用更大的初始学习率来加快收敛速度​​。文档是这里。您需要让您的模型运行几个 epoch,以查看训练损失和验证损失是否正在减少。

于 2020-10-09T06:55:37.773 回答