首页 > 解决方案 > 有人可以看看我的 Keras CNN 模型并帮助我找出提高训练和验证准确性的方法吗?

问题描述

my_model = models.Sequential() 
#first convolutional block 
my_model.add(Conv2D(16, (3, 3), input_shape = (178, 218, 3), activation="relu", padding="same")) 
#add dropout 
my_model.add(Dropout(0.5))
my_model.add(MaxPooling2D((2, 2), padding="same")) 

#second block 
my_model.add(Conv2D(32, (3, 3), activation="relu", padding="same"))
#add dropout 
my_model.add(Dropout(0.5))

my_model.add(MaxPooling2D((2, 2), padding="same"))

#third block 
my_model.add(Conv2D(64, (3, 3), activation="relu", padding="same"))
#add dropout 
my_model.add(Dropout(0.5))

my_model.add(MaxPooling2D((2, 2), padding="same"))

#fourth block 
my_model.add(Conv2D(128, (3, 3), activation="relu", padding="same"))
#add dropout 
my_model.add(Dropout(0.5))

my_model.add(MaxPooling2D((2, 2), padding="same")) 

#global average pooling 
my_model.add(GlobalAveragePooling2D())

#fully connected layer 
my_model.add(Dense(64, activation='relu'))
my_model.add(BatchNormalization())

#make predictions 
my_model.add(Dense(18, activation="softmax")) 

from tensorflow.python.keras.callbacks import EarlyStopping, ModelCheckpoint 
es = EarlyStopping(monitor="val_loss", mode="min",verbose=1, patience=5) 

mc = ModelCheckpoint('/content/model.h5', monitor="val_loss", mode="min", verbose=1, save_best_only=True) 

cb_list=[es,mc]  

# compile model 
from keras.optimizers import Adam 
my_model.compile(optimizer=Adam(learning_rate=0.00005),loss="categorical_crossentropy", metrics=["accuracy"]) 

from tensorflow.python.keras.applications.vgg16 import preprocess_input
from tensorflow.python.keras.preprocessing.image import ImageDataGenerator 

#set up data generator 
data_generator = ImageDataGenerator(preprocessing_function=preprocess_input) 

#get batches of training images from the directory 
train_generator = data_generator.flow_from_directory(
        '/content/output7/train',
        target_size=(224, 224),
        batch_size=32,
        class_mode='categorical')

validation_generator = data_generator.flow_from_directory(
        '/content/output7/val',
        target_size=(224, 224),
        batch_size=32,
        class_mode='categorical') 

history = my_model.fit(train_generator, epochs = 100, steps_per_epoch=350, validation_data = validation_generator, validation_steps = 100, callbacks = cb_list) 

这是我在 Google Colab 和 Python 中使用 keras 进行图像分类的模型的代码。现在我被困在大约 30% 的训练准确率和 10% 的验证准确率。我可以查看的任何资源或我可以进行的特定代码修改的建议都会有所帮助!

一些背景信息:我选择添加 dropout 层来帮助减少任何过度拟合的情况。图像存储在 18 个不同的类中。大约有 11000 张训练图像和 2800 张验证图像。

标签: pythontensorflowkerasconv-neural-networkgoogle-colaboratory

解决方案


那么你有很多辍学的方式。移除除最后一层之外的所有丢弃层,并将速率设置为 0.3 左右。在您的早期停止检查点中添加参数 restore_best_weights=True。这将导致您的模型以设置为具有最低验证损失的 epoch 的权重结束训练。然后你不需要减慢训练的检查点回调。还可以使用 Keras 回调 ReduceLROnPlateau 添加可调整的学习。将其设置为监视验证丢失,如下面的代码所示:

rlronp=tf.keras.callbacks.ReduceLROnPlateau( monitor="val_loss", 
                                            factor=0.5,patience=10, verbose=1)

将 rlronp 添加到回调列表中。您正在对过度拟合做出假设。您需要在模型训练时监控训练损失和验证损失。过度拟合是指训练损失继续减少,而验证损失开始呈上升趋势。如果这种情况在早期开始发生,那么增加 dropout 的数量。如果它在后期开始发生,则提前停止回调应该跳闸并将最佳权重返回给模型。


推荐阅读