如何降低CNN模型的验证损失并改善测试结果

如何提高验证准确率?此外,我的测试准确率也很低。我正在尝试对农业领域的杂草检测图片进行分类图像分类。

数据集:总共5539张图片,分为12个类别,其中70%(3870张图片)用于训练集,15%(837图片)用于验证集,15%(832张图片)用于测试集

#通过应用Augmentor进行数据增强train_aug = Augmentor.Pipeline(source_directory="/content/dataset/train",                      output_directory="/content/dataset/train")# 定义增强参数并生成17600个样本 train_aug.flip_left_right(probability=0.4) train_aug.flip_top_bottom(probability=0.8)train_aug.rotate(probability=0.5, max_left_rotation=5, max_right_rotation=10)train_aug.skew(0.4, 0.5) train_aug.zoom(probability = 0.2, min_factor = 1.1, max_factor = 1.5) train_aug.sample(17600)    def cnn_model():  Model = tf.keras.models.Sequential([         tf.keras.layers.Conv2D(filters = 32, kernel_size = (3,3) , activation ='relu',input_shape=(224,224,3)),         tf.keras.layers.MaxPool2D(2,2),                          tf.keras.layers.Conv2D(filters = 96, kernel_size = (3,3) , activation ='relu'),         tf.keras.layers.MaxPool2D(2,2),                  tf.keras.layers.Conv2D(filters = 150, kernel_size = (3,3) , activation ='relu'),         tf.keras.layers.MaxPool2D(2,2),                 tf.keras.layers.Conv2D(filters = 64, kernel_size = (3,3) , activation ='relu'),         tf.keras.layers.MaxPool2D(2,2),                           tf.keras.layers.Flatten() ,             tf.keras.layers.Dense(512,activation='relu') ,          tf.keras.layers.Dropout(0.2),                  tf.keras.layers.Dense(416, [enter image description here][1]activation='relu') ,          tf.keras.layers.Dropout(0.2),                                    tf.keras.layers.Dense(12,activation='softmax') ,             ])  Model.summary()  return ModelModel = cnn_model()from tensorflow.keras.callbacks import ModelCheckpointcheckpoint = ModelCheckpoint(filepath, monitor='accuracy', verbose=1, save_best_only=False, save_weights_only=True, mode='auto')callbacks_list = [checkpoint]model= Model.compile(tf.keras.optimizers.Adam(lr=0.001), loss='categorical_crossentropy', metrics=['accuracy']) History = Model.fit_generator(generator= train_data, steps_per_epoch= 3333//BATCH_SIZE , epochs= NO_OF_EPOCHS , validation_data= valid_data, validation_steps=1 ,callbacks=callbacks_list)

当我的训练准确率为98%,验证准确率为71%时,如何提高验证准确率?


回答:

我会将滤波器的数量调整为32,然后是64,128,256。然后我会用

tf.keras.layers.GlobalAveragePooling2D()

替换Flatten层。我还会移除checkpoint回调,并替换为

es=tf.keras.callbacks.EarlyStopping( monitor="val_loss", patience=3,                                     verbose=1,  restore_best_weights=True)rlronp=tf.keras.callbacks.ReduceLROnPlateau( monitor="val_loss", factor=0.5, patience=1,                                             verbose=1)callback_list=[es, rlronp]

早期停止回调将监控验证损失,如果连续3个epoch后损失未能降低,它将停止训练并将最佳epoch的权重恢复到模型中。ReduceLROnPlateau回调将监控验证损失,如果在epoch结束时损失未降低,则将学习率降低0.5倍。运行这些,如果效果没有显著改善,你可以尝试使用class_weight字典来补偿类别不平衡。计算字典时,找到样本数最多的类别。然后每个类别的权重计算公式为:类别的权重=样本数最多的类别的样本数/该类别的样本数。因此,创建一个形式为类别整数:权重的字典。请注意保持类别的顺序正确。为了帮助解决不平衡问题,你还可以尝试图像增强。如果你使用ImageDataGenerator.flow_from_directory读取数据,你可以使用生成器提供图像增强,如水平翻转。如果没有,你可以直接在模型中使用Keras的增强层。文档在此处

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注