Tensorflow 对象检测中的过度拟合 API
Overfitting in Tensorflow Object detection API
我正在自定义数据集(即车牌数据集)上训练 tensorflow 对象检测 API 模型。 我的目标是使用 tensorflow lite 将此模型部署到边缘设备,因此我不能使用任何 RCNN 系列模型。因为,我无法将任何 RCNN 系列对象检测模型转换为 tensorflow lite 模型(这是 tensorflow 对象检测的限制 API)。我正在使用 ssd_mobilenet_v2_coco 模型来训练自定义数据集。以下是我的配置文件的代码片段:
model {
ssd {
num_classes: 1
box_coder {
faster_rcnn_box_coder {
y_scale: 10.0
x_scale: 10.0
height_scale: 5.0
width_scale: 5.0
}
}
matcher {
argmax_matcher {
matched_threshold: 0.5
unmatched_threshold: 0.5
ignore_thresholds: false
negatives_lower_than_unmatched: true
force_match_for_each_row: true
}
}
similarity_calculator {
iou_similarity {
}
}
anchor_generator {
ssd_anchor_generator {
num_layers: 6
min_scale: 0.2
max_scale: 0.95
aspect_ratios: 1.0
aspect_ratios: 2.0
aspect_ratios: 0.5
aspect_ratios: 3.0
aspect_ratios: 0.3333
}
}
image_resizer {
fixed_shape_resizer {
height: 300
width: 300
}
}
box_predictor {
convolutional_box_predictor {
min_depth: 0
max_depth: 0
num_layers_before_predictor: 0
use_dropout: false
dropout_keep_probability: 0.8
kernel_size: 1
box_code_size: 4
apply_sigmoid_to_scores: false
conv_hyperparams {
activation: RELU_6,
regularizer {
l2_regularizer {
weight: 0.00004
}
}
initializer {
truncated_normal_initializer {
stddev: 0.03
mean: 0.0
}
}
batch_norm {
train: true,
scale: true,
center: true,
decay: 0.9997,
epsilon: 0.001,
}
}
}
}
feature_extractor {
type: 'ssd_mobilenet_v2'
min_depth: 16
depth_multiplier: 1.0
conv_hyperparams {
activation: RELU_6,
regularizer {
l2_regularizer {
weight: 0.00004
}
}
initializer {
truncated_normal_initializer {
stddev: 0.03
mean: 0.0
}
}
batch_norm {
train: true,
scale: true,
center: true,
decay: 0.9997,
epsilon: 0.001,
}
}
}
loss {
classification_loss {
weighted_sigmoid {
}
}
localization_loss {
weighted_smooth_l1 {
}
}
hard_example_miner {
num_hard_examples: 3000
iou_threshold: 0.99
loss_type: CLASSIFICATION
max_negatives_per_positive: 3
min_negatives_per_image: 3
}
classification_weight: 1.0
localization_weight: 1.0
}
normalize_loss_by_num_matches: true
post_processing {
batch_non_max_suppression {
score_threshold: 1e-8
iou_threshold: 0.6
max_detections_per_class: 100
max_total_detections: 100
}
score_converter: SIGMOID
}
}
}
train_config: {
batch_size: 24
optimizer {
rms_prop_optimizer: {
learning_rate: {
exponential_decay_learning_rate {
initial_learning_rate: 0.004
decay_steps: 800720
decay_factor: 0.95
}
}
momentum_optimizer_value: 0.9
decay: 0.9
epsilon: 1.0
}
}
fine_tune_checkpoint: "/home/sach/DL/Pycharm_Workspace/TF1.14/License_Plate_F-RCNN/dataset/experiments/training_SSD/ssd_mobilenet_v2_coco_2018_03_29/model.ckpt"
fine_tune_checkpoint_type: "detection"
num_steps: 150000
data_augmentation_options {
random_horizontal_flip {
}
}
data_augmentation_options {
ssd_random_crop {
}
}
}
train_input_reader: {
tf_record_input_reader {
input_path: "/home/sach/DL/Pycharm_Workspace/TF1.14/License_Plate_F-RCNN/dataset/records/training.record"
}
label_map_path: "/home/sach/DL/Pycharm_Workspace/TF1.14/License_Plate_F-RCNN/dataset/records/classes.pbtxt"
}
eval_config: {
num_examples: 488
num_visualizations : 488
}
eval_input_reader: {
tf_record_input_reader {
input_path: "/home/sach/DL/Pycharm_Workspace/TF1.14/License_Plate_F-RCNN/dataset/records/testing.record"
}
label_map_path: "/home/sach/DL/Pycharm_Workspace/TF1.14/License_Plate_F-RCNN/dataset/records/classes.pbtxt"
shuffle: false
num_readers: 1
}
我总共有 1932 张图像(火车图像:1444 和 val 图像:448)。我已经训练模型 150000 步。以下是张量板的输出:
DetectionBoxes Precision mAP@0.5 IOU:经过 150K 步后,对象检测模型精度(mAP@0.5 IOU)为~0.97,即 97%。目前看来还不错。
训练损失: 150K 步后,训练损失为~1.3。这个好像还行。
Evaluation/Validation 损失:在 150K 步之后,evaluation/validation 损失是 ~3.90,这是相当高的。然而,训练和评估损失之间存在巨大差异。是否存在过拟合?我怎样才能克服这个问题?在我看来,training 和 evaluation loss 应该是接近的。
- 如何减少 validation/evaluation 损失?
- 我使用的是默认配置文件,所以默认
use_dropout: false
。如果存在过度拟合,我应该将其更改为 use_dropout: true
吗?
- 对象检测模型的训练和验证损失的可接受范围应该是多少?
请分享您的观点。感谢您!
在神经网络中,过度拟合问题有多种原因,通过查看您的配置文件,我想提出一些建议来避免过度拟合。
use_dropout: true
使神经元对权重的微小变化不那么敏感。
尝试在 batch_non_max_suppression
中增加 iou_threshold
。
使用 l1 regularizer
或 l1 and l2 regularizer
的组合。
将优化器更改为 Nadam
或 Adam
优化器。
包括更多 Augmentation
技巧。
您还可以使用 Early Stopping
来跟踪您的准确性。
或者,您可以观察 Tensorboard
可视化,在验证损失开始增加的步骤之前获取权重。
我希望尝试这些步骤能够解决您模型的过度拟合问题。
我正在自定义数据集(即车牌数据集)上训练 tensorflow 对象检测 API 模型。 我的目标是使用 tensorflow lite 将此模型部署到边缘设备,因此我不能使用任何 RCNN 系列模型。因为,我无法将任何 RCNN 系列对象检测模型转换为 tensorflow lite 模型(这是 tensorflow 对象检测的限制 API)。我正在使用 ssd_mobilenet_v2_coco 模型来训练自定义数据集。以下是我的配置文件的代码片段:
model {
ssd {
num_classes: 1
box_coder {
faster_rcnn_box_coder {
y_scale: 10.0
x_scale: 10.0
height_scale: 5.0
width_scale: 5.0
}
}
matcher {
argmax_matcher {
matched_threshold: 0.5
unmatched_threshold: 0.5
ignore_thresholds: false
negatives_lower_than_unmatched: true
force_match_for_each_row: true
}
}
similarity_calculator {
iou_similarity {
}
}
anchor_generator {
ssd_anchor_generator {
num_layers: 6
min_scale: 0.2
max_scale: 0.95
aspect_ratios: 1.0
aspect_ratios: 2.0
aspect_ratios: 0.5
aspect_ratios: 3.0
aspect_ratios: 0.3333
}
}
image_resizer {
fixed_shape_resizer {
height: 300
width: 300
}
}
box_predictor {
convolutional_box_predictor {
min_depth: 0
max_depth: 0
num_layers_before_predictor: 0
use_dropout: false
dropout_keep_probability: 0.8
kernel_size: 1
box_code_size: 4
apply_sigmoid_to_scores: false
conv_hyperparams {
activation: RELU_6,
regularizer {
l2_regularizer {
weight: 0.00004
}
}
initializer {
truncated_normal_initializer {
stddev: 0.03
mean: 0.0
}
}
batch_norm {
train: true,
scale: true,
center: true,
decay: 0.9997,
epsilon: 0.001,
}
}
}
}
feature_extractor {
type: 'ssd_mobilenet_v2'
min_depth: 16
depth_multiplier: 1.0
conv_hyperparams {
activation: RELU_6,
regularizer {
l2_regularizer {
weight: 0.00004
}
}
initializer {
truncated_normal_initializer {
stddev: 0.03
mean: 0.0
}
}
batch_norm {
train: true,
scale: true,
center: true,
decay: 0.9997,
epsilon: 0.001,
}
}
}
loss {
classification_loss {
weighted_sigmoid {
}
}
localization_loss {
weighted_smooth_l1 {
}
}
hard_example_miner {
num_hard_examples: 3000
iou_threshold: 0.99
loss_type: CLASSIFICATION
max_negatives_per_positive: 3
min_negatives_per_image: 3
}
classification_weight: 1.0
localization_weight: 1.0
}
normalize_loss_by_num_matches: true
post_processing {
batch_non_max_suppression {
score_threshold: 1e-8
iou_threshold: 0.6
max_detections_per_class: 100
max_total_detections: 100
}
score_converter: SIGMOID
}
}
}
train_config: {
batch_size: 24
optimizer {
rms_prop_optimizer: {
learning_rate: {
exponential_decay_learning_rate {
initial_learning_rate: 0.004
decay_steps: 800720
decay_factor: 0.95
}
}
momentum_optimizer_value: 0.9
decay: 0.9
epsilon: 1.0
}
}
fine_tune_checkpoint: "/home/sach/DL/Pycharm_Workspace/TF1.14/License_Plate_F-RCNN/dataset/experiments/training_SSD/ssd_mobilenet_v2_coco_2018_03_29/model.ckpt"
fine_tune_checkpoint_type: "detection"
num_steps: 150000
data_augmentation_options {
random_horizontal_flip {
}
}
data_augmentation_options {
ssd_random_crop {
}
}
}
train_input_reader: {
tf_record_input_reader {
input_path: "/home/sach/DL/Pycharm_Workspace/TF1.14/License_Plate_F-RCNN/dataset/records/training.record"
}
label_map_path: "/home/sach/DL/Pycharm_Workspace/TF1.14/License_Plate_F-RCNN/dataset/records/classes.pbtxt"
}
eval_config: {
num_examples: 488
num_visualizations : 488
}
eval_input_reader: {
tf_record_input_reader {
input_path: "/home/sach/DL/Pycharm_Workspace/TF1.14/License_Plate_F-RCNN/dataset/records/testing.record"
}
label_map_path: "/home/sach/DL/Pycharm_Workspace/TF1.14/License_Plate_F-RCNN/dataset/records/classes.pbtxt"
shuffle: false
num_readers: 1
}
我总共有 1932 张图像(火车图像:1444 和 val 图像:448)。我已经训练模型 150000 步。以下是张量板的输出:
DetectionBoxes Precision mAP@0.5 IOU:经过 150K 步后,对象检测模型精度(mAP@0.5 IOU)为~0.97,即 97%。目前看来还不错。
训练损失: 150K 步后,训练损失为~1.3。这个好像还行。
Evaluation/Validation 损失:在 150K 步之后,evaluation/validation 损失是 ~3.90,这是相当高的。然而,训练和评估损失之间存在巨大差异。是否存在过拟合?我怎样才能克服这个问题?在我看来,training 和 evaluation loss 应该是接近的。
- 如何减少 validation/evaluation 损失?
- 我使用的是默认配置文件,所以默认
use_dropout: false
。如果存在过度拟合,我应该将其更改为use_dropout: true
吗? - 对象检测模型的训练和验证损失的可接受范围应该是多少?
请分享您的观点。感谢您!
在神经网络中,过度拟合问题有多种原因,通过查看您的配置文件,我想提出一些建议来避免过度拟合。
use_dropout: true
使神经元对权重的微小变化不那么敏感。
尝试在 batch_non_max_suppression
中增加 iou_threshold
。
使用 l1 regularizer
或 l1 and l2 regularizer
的组合。
将优化器更改为 Nadam
或 Adam
优化器。
包括更多 Augmentation
技巧。
您还可以使用 Early Stopping
来跟踪您的准确性。
或者,您可以观察 Tensorboard
可视化,在验证损失开始增加的步骤之前获取权重。
我希望尝试这些步骤能够解决您模型的过度拟合问题。