如何提高验证准确率?此外,我的测试准确率也很低。我正在尝试对农业领域的杂草检测图片进行分类图像分类。
数据集:总共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的增强层。文档在此处。