繁体   English   中英

如何减少验证损失并改善 CNN Model 中的测试结果

[英]how to reducing validation loss and improving the test result in CNN Model

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

数据集:图像总数为 5539,有 12 个类别,其中训练集的 70%(3870 幅图像)、验证集的 15%(837 幅图像)和测试集的 15%(832 幅图像)

#data augmentation by applying Augmentor

train_aug = Augmentor.Pipeline(source_directory="/content/dataset/train",
                      output_directory="/content/dataset/train")

# Defining augmentation parameters and generating 17600 samples 
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 Model

Model = cnn_model()

from tensorflow.keras.callbacks import ModelCheckpoint
checkpoint = 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()

我还将删除检查点回调并替换为

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 恢复到 model。 如果在 epoch 结束时损失没有减少,ReduceLROnPlateau 回调将监控验证损失并将学习率降低 5 倍。 运行它,如果它没有做得更好,您可以尝试使用 class_weight 字典来尝试补偿 class 不平衡。 要计算字典,请找到样本数最多的 class。 然后每个 class 的权重是类的权重 = class 中样本的最高数量/样本。 因此,创建一个格式为 class integer:weight 的字典。 注意保持类的顺序正确。 此外,为了帮助解决不平衡,您可以尝试图像增强。 如果您使用 ImageDataGenerator.flow_from_directory 读取数据,则可以使用生成器提供图像增强,如水平翻转。 如果没有,您可以直接在 model 中使用 Keras 增强层。 文档在这里。 .

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM