Tensorflow 为什么我的CNN/图像分类器模型精度如此低?

Tensorflow 为什么我的CNN/图像分类器模型精度如此低?,tensorflow,keras,deep-learning,conv-neural-network,image-classification,Tensorflow,Keras,Deep Learning,Conv Neural Network,Image Classification,我目前正在尝试建立一个CNN,它可以检测患者是否患有由新冠病毒引起的肺炎,并且无论我改变什么参数,模型的准确率都保持在49%/50%,因此基本上没有用,因为它与掷硬币一样。这是我的代码,我想我会尝试使用VGG-16模型 from tensorflow.keras.optimizers import Adam from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Conv2

我目前正在尝试建立一个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])
从tensorflow.keras.optimizers导入Adam
从tensorflow.keras.models导入顺序
从tensorflow.keras.layers导入稠密、Conv2D、MaxPool2D、GlobalAveragePoolg2D
从tensorflow.keras.callbacks导入模型检查点,EarlyStopping
从keras.preprocessing.image导入ImageDataGenerator
#在数据集中加载
traindata=ImageDataGenerator(重缩放=1/255)
trainingdata=traindata.flow\u,来自\u目录(
directory=“Covid-19CT/TrainingData”,
目标_大小=(224224),
批次尺寸=100,
class_mode=“二进制”)
testdata=ImageDataGenerator(重缩放=1/255)
testingdata=testdata.flow\u来自\u目录(
directory=“Covid-19CT/TestingData”,
目标_大小=(224224),
批次尺寸=100,
class_mode=“二进制”)
#使用顺序和添加层+输入和输出初始化模型………]-预计到达时间:1:22:37-
损失:7.5388-准确度:0.5083

培训数据和测试数据-培训数据有2个子文件夹Covid19CT和noncovid19CT,测试数据也有2个子文件夹Covid19CT和noncovid19CT
  • 还有:我是不是太不耐烦了?我从不让它跑过第一个时代,因为我只是假设它永远不会超过50%,会不会是模型在下一个时代会改进得更多

  • 如果有人愿意帮忙,或者如果你需要任何其他信息来帮助你更好地理解这个问题,请让我知道

    因为你使用的是二元交叉熵,1个单位的致密层中的激活函数应该是“sigmoid”。因为你没有使用GPU,你每个历元有很长的训练时间。要查看模型是否正常工作,您可能需要减少此时间。你能做的事情很少。尝试将图像大小减小到128乘128。对于224 X 224,您需要处理50176个像素,而对于128 X 128图像,需要处理16384个像素,因此您可以将计算量减少大约3倍。还有两个密度为4096个单位的密集层。这也是计算费用。这也可能导致过度装配。最初尝试不使用这些层的模型,并查看其性能。我不喜欢提前停车,因为这是避免处理过度装修问题的一个支柱。如果遇到过盈,请添加一个脱落层以帮助避免过盈。最后,我建议您使用可调整的学习率。回调ReducelRonPlatforme使此操作变得简单。将其设置为监视验证丢失。您可以设置参数以降低工厂的学习率,您必须等待模型完成培训。从ETA来看,每个历元的等待时间似乎为1个半小时,您已将其设置为运行10个历元。因此,要么等待培训完成,要么在其上运行您的模型GPU@mb0850你好非常感谢您的回复!我真的很感激。所以在看过我的模型后,除了我应该等待之外,它没有什么真正的问题?我查看了keras图层文档,然后对参数进行了一些调整,所以不确定是否一切都是应该的。再次感谢你!具有1个输出神经元的softmax没有sense@MarcoCerliani嘿,是的,谢谢你指出这一点。我在胡闹,尝试不同的层参数,不同的优化器,激活等等,可能忘了更改其中一个。你好!谢谢你的详细建议,我真的很感激。我按照你的建议降低了4096个单位的密集层,它加快了ETA的速度,这非常有帮助,但不幸的是,该模型仍然达到了60-66%的最大精度。在这一点上,我认为这可能与数据的质量有关,但我仍将继续调整图层,看看这是否有帮助。如果您有任何进一步的见解,请让我知道,我真的非常感谢您的帮助。非常感谢。您是否尝试过可调学习率,它应该会有所帮助。如果你想进行迁移学习,而你没有;我没有gpu,我建议你使用MobileNet。文件载于。Vgg有大约1.4亿个参数,而MobileNet有4个参数,精度也差不多。在时间方面,它的计算速度要快得多。是的,我用建议的参数添加了可调整的学习速率,它确实起了一些作用。然而,在精确度方面确实发生了一些奇怪的事情,它在两个之间波动,通常情况下,它不会太大,但它会上下波动40%。由于字符限制,我将解释历元片段:历元1、2、3开始从57%上升到89%。准确度继续上升到第10纪元,在那里它以99%的准确度达到最高,然后在第19纪元的准确度大幅下降到44%,现在不再上升。我保持了早期的停止,但我会尝试用你建议的退出层替换它。也可能会减少年代,因为达到50岁需要相当长的时间。谢谢你的帮助,我很感激。