python - 有人可以看看我的 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 张验证图像。
解决方案
那么你有很多辍学的方式。移除除最后一层之外的所有丢弃层,并将速率设置为 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 的数量。如果它在后期开始发生,则提前停止回调应该跳闸并将最佳权重返回给模型。
推荐阅读
- c - cs50 过滤器(模糊)分配(pset4)(已解决!)
- .htaccess - 如何将 /page/ 重定向到 page.html
- scala - PySpark 将 Dataframe 作为额外参数传递给映射
- java - Collection.reverse() 方法不适用于 Integer ArrayList
- stripe-payments - 从当月的第一个日期开始的条带订阅,初始费用
- java - 如何开发自定义 SonarQube 插件?
- c++ - std::shared_ptr
显示到文本浏览器? - .net - 使用反射 VB.NET 调用具有自定义类型参数的函数
- react-native - 如何在抽屉导航中创建菜单图标?反应原生
- javascript - 如何修复 Appendchild 不是函数且 JavaScript 中未定义变量?