Tensorflow 为什么我的CNN/图像分类器模型精度如此低?
我目前正在尝试建立一个CNN,它可以检测患者是否患有由新冠病毒引起的肺炎,并且无论我改变什么参数,模型的准确率都保持在49%/50%,因此基本上没有用,因为它与掷硬币一样。这是我的代码,我想我会尝试使用VGG-16模型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
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岁需要相当长的时间。谢谢你的帮助,我很感激。