CNN模型的准确率最高达到99%,然后在几个时期后下降到50%



我正在创建一个CNN,可以将CT扫描分为新冠肺炎诱导的肺炎阳性和健康CT阴性。我对我的模型进行了50个时期的测试;从历元1-10开始,它逐渐增加,并在历元10达到99%的准确率。然而,几个时代后,它急剧下降到44%,这对于二元分类的CNN来说是可怕的。这是我的型号:

# Loading in the dataset
traindata = ImageDataGenerator(rescale=1/255)
trainingdata = traindata.flow_from_directory(
directory="Covid-19CT/TrainingData",
target_size=(128,128),
batch_size=16,
class_mode="binary")
testdata = ImageDataGenerator(rescale=1/255)
testingdata = testdata.flow_from_directory(
directory="Covid-19CT/TestingData",
target_size=(128,128),
batch_size=16,
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=(128,128,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(Flatten())
model.add(Dense(units=1000, activation="relu"))
model.add(Dense(units=1, activation="sigmoid"))
# 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='accuracy', verbose=1, save_best_only=True, save_weights_only=False, mode='auto')
early = EarlyStopping(monitor='accuracy', min_delta=0, patience=50, verbose=1, mode='auto')
reduceLR = ReduceLROnPlateau(monitor='val_loss', factor=.5, patience=2, min_delta=0.01, mode="auto")
fit = model.fit_generator(steps_per_epoch=25, generator=trainingdata, validation_data=testingdata, validation_steps=10,epochs=50,callbacks=[checkpoint,early])

以下是训练的准确性:Epoch 1/5024/25【==========================>..】-预计到达时间:12s-损失:0.7703-精度:0.5495Epoch 00001:精度从-inf提高到0.54500,将模型保存到Covid-19.hdf525/25【=========================】-360s 14s/步-损耗:0.7646-精度:0.5450-val_loss:0.6984-val_accuracy:0.4313

Epoch 2/5024/25【==========================>..】-预计到达时间:13s-损失:0.8016-精度:0.7240Epoch 00002:精度从0.54500提高到0.73250,将模型保存到Covid-19.hdf525/25【=========================】-374s 15s/步-损耗:0.7868-精度:0.7325-val_loss:4.4926-val_accuracy:0.6375

Epoch 3/5024/25【=========================>..】-预计到达时间:11s-损耗:0.3555-精度:0.8960Epoch 00003:准确度从0.73250提高到0.89003,将模型保存到Covid-19.hdf525/25【=========================】-344s 14s/步-损耗:0.3941-精度:0.8900-val_loss:3.2895-val_accuracy:0.7000

Epoch 4/5024/25【==========================>..】-预计到达时间:13s-损耗:0.2441-精度:0.9297Epoch 00004:准确度从0.89003提高到0.93000,将模型保存到Covid-19.hdf525/25【=========================】-385s 15s/步-损耗:0.2387-精度:0.9300-val_loss:1.2085-val_accurcy:0.6687

Epoch 5/5024/25【==========================>..】-预计到达时间:13s-损失:0.1788-精度:0.9714Epoch 00005:精度从0.93000提高到0.97250,将模型保存到Covid-19.hdf525/25【=========================】-381s 15s/步-损耗:0.1755-精度:0.9725-val_loss:2.5818-val_accuracy:0.7125

Epoch 6/5024/25【==========================>..】-预计到达时间:12s-损耗:0.0642-精度:0.9844Epoch 00006:精度从0.97250提高到0.98000,将模型保存到Covid-19.hdf525/25【=========================】-363s 15s/步-损耗:0.0670-精度:0.9800-val_loss:4.4083-val_accuracy:0.7125

Epoch 7/5024/25【==========================>..】-ETA:12s-损耗:0.0947-精度:0.9479Epoch 00007:精度没有从0.98000提高25/25【=========================】-362s 14s/步-损耗:0.0937-精度:0.9500-val_loss:4.2777-val_accurcy:0.7000

Epoch 8/5024/25【==========================>..】-预计到达时间:13s-损耗:0.1298-精度:0.9505Epoch 00008:精度没有从0.98000提高25/25【=========================】-375s 15s/步-损耗:0.1301-精度:0.9475-val_loss:1.5817-val_accurcy:0.4688

Epoch 9/5024/25【==========================>..】-预计到达时间:13s-损耗:0.0506-精度:0.9740Epoch 00009:精度没有从0.98000提高25/25【=========================】-378s 15s/步-损耗:0.0486-精度:0.9750-val_loss:4.3898-val_accuracy:0.7125

Epoch 10/5024/25【==========================>..】-预计到达时间:12s-损失:0.0263-准确度:0.9922Epoch 00010:准确度从0.98000提高到0.99250,将模型保存到Covid-19.hdf525/25【=========================】-368s 15s/步-损耗:0.0252-精度:0.9925-val_loss:4.3956-val_accuracy:0.6875

Epoch 11/5024/25【==========================>..】-预计到达时间:12s-损耗:0.1428-精度:0.9714Epoch 00011:准确度从0.99250没有提高25/25【=========================】-346s 14s/步-损耗:0.1378-精度:0.9725-val_loss:2.3141-val_accuracy:0.5188

Epoch 12/5024/25【==========================>..】-预计到达时间:11s-损失:0.2058-精度:0.9479Epoch 00012:准确度从0.99250没有提高25/25【=========================】-343s 14s/步-损耗:0.2006-精度:0.9500-val_loss:2.2401-val_accuracy:0.6750

Epoch 13/5024/25【==========================>..】-预计到达时间:12s-损耗:0.0434-精度:0.9818Epoch 00013:准确度从0.99250没有提高25/25【=========================】-363s 15s/步-损耗:0.0417-精度:0.9825-val_loss:4.3546-val_accuracy:0.7000

Epoch 14/5024/25【==========================>..】-预计到达时间:12s-损失:0.0242-准确度:0.9974Epoch 00014:准确度从0.99250提高到0.99750,将模型保存到Covid-19.hdf525/25【=========================】-361s 14s/步-损耗:0.0256-精度:0.9975-val_loss:4.4083-val_accuracy:0.7125

Epoch 15/5024/25【==========================>..】-预计到达时间:12s-损失:0.0298-准确度:0.9922Epoch 00015:准确度从0.99750没有提高25/25【=========================】-367s 15s/步-损耗:0.0286-精度:0.9925-val_loss:3.9429-val_accurcy:0.7125

Epoch 16/5024/25===========================>..]-ETA:11s-损耗:0.0045-精度:0.9974Epoch 00016:准确度从0.99750没有提高25/25【=========================】-338s 14s/步-损失:0.0043-准确度:0.9975-val_loss:4.4335-val_accuracy:0.7063

Epoch 17/5024/25【==========================>..】-预计到达时间:11s-损耗:0.2831-精度:0.9479Epoch 00017:准确度从0.99750没有提高25/25【=========================】-336s 13s/步-损耗:0.2750-精度:0.9500-val_loss:2.4855-val_accuracy:0.6625

Epoch 18/5024/25【==========================>..】-预计到达时间:14s-损失:1.4282-精度:0.9036Epoch 00018:准确度从0.99750没有提高25/25【=========================】-400s 16s/步-损耗:1.6394-精度:0.8900-val_loss:6.6125-val_accuracy:0.5688

Epoch 19/5024/25===========================>..]-预计到达时间:12s-损失:8.0488-精度:0.4693Epoch 00019:准确度从0.99750没有提高25/25【=========================】-349s 14s/步-损耗:7.9984-精度:0.4731-val_loss:6.6125-val_accuracy:0.5688

Epoch 20/5024/25【=========================>..】-预计到达时间:11s-损失:7.6267-精度:0.5026Epoch 00020:准确度从0.99750没有提高25/25【=========================】-342s 14s/步-损耗:7.5900-精度:0.5050-val_loss:6.6125-val_accurcy:0.5688

Epoch 21/5024/25【==========================>..】-预计到达时间:12s-损失:8.2656-精度:0.4609

我想我最终会用脱落层取代Early Stopping,但我不明白准确性下降的原因。虽然模型的准确率可能达到99%,但为什么会突然下降?

如果你愿意,你可以按照建议提前停止或训练较少的时期,我注意到你正在监控"准确度";在您的回调中。通常最好监控验证损失并以最低的损失保存模型。验证丢失表明您的模型在多大程度上适用于看不见的图像。仅供参考,我注意到你正在保存整个模型。这很好,但它大大减缓了完成训练所需的时间。试着只保存检查点回调中的权重。它要快得多,尤其是如果你有一个大模型的话。训练完成后,运行model.load_weights进行预测。然后你可以用model.save保存整个模型。所有这些都不能解决为什么你的模型训练损失在第十个纪元后开始飙升的问题。我想不通。在评论中指出数据集的位置,我会看看是否可以重复这个问题。作为一个快速检查,你有多少训练样本和多少测试样本?您希望每个历元检查一次验证集。因此,您需要设置validation_batch_size,使验证样本数除以validation_batch_size为整数。使用该整数作为验证步骤。下面是一段代码,给定一个目录路径和基于内存容量(b_max)可以允许的最大批处理大小,将为您提供batch_size和步骤。它遍历目录(例如test_dir),将所有子目录中所有文件的计数相加(可变长度),然后确定批处理大小和步骤。

def get_bs(dir,b_max):
# dir is the directory containing the samples, b_max is maximum batch size to allow based on your memory capacity
# you only want to go through test and validation set once per epoch this function determines needed batch size ans steps per epoch
length=0
dir_list=os.listdir(dir)
for d in dir_list:
d_path=os.path.join (dir,d)
length=length + len(os.listdir(d_path))
batch_size=sorted([int(length/n) for n in range(1,length+1) if length % n ==0 and length/n<=b_max],reverse=True)[0]  
return batch_size,int(length/batch_size), length

如果您在测试目录上运行此操作,则应该得到batch_size=79,steps=14,length=1106,b_max设置为80。

最新更新