【问题标题】:Can you run training and evalutaion process from a single anaconda prompt?您可以从单个 anaconda 提示符运行培训和评估过程吗?
【发布时间】:2021-11-30 09:20:21
【问题描述】:

我在训练 Tensorflow2 自定义对象检测器期间无法评估我的训练过程。在阅读了与这个问题相关的几个问题后,我发现评估和培训应该被视为两个独立的过程,因此我应该使用新的 anaconda 提示符来开始评估工作。 我正在使用 ssd_mobilenetv2 640x640 版本进行培训。我的管道配置:

model {
  ssd {
    num_classes: 6
    image_resizer {
      fixed_shape_resizer {
        height: 640
        width: 640
      }
    }
    feature_extractor {
      type: "ssd_mobilenet_v2_fpn_keras"
      depth_multiplier: 1.0
      min_depth: 16
      conv_hyperparams {
        regularizer {
          l2_regularizer {
            weight: 3.9999998989515007e-05
          }
        }
        initializer {
          random_normal_initializer {
            mean: 0.0
            stddev: 0.009999999776482582
          }
        }
        activation: RELU_6
        batch_norm {
          decay: 0.996999979019165
          scale: true
          epsilon: 0.0010000000474974513
        }
      }
      use_depthwise: true
      override_base_feature_extractor_hyperparams: true
      fpn {
        min_level: 3
        max_level: 7
        additional_layer_depth: 128
      }
    }
    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
        use_matmul_gather: true
      }
    }
    similarity_calculator {
      iou_similarity {
      }
    }
    box_predictor {
      weight_shared_convolutional_box_predictor {
        conv_hyperparams {
          regularizer {
            l2_regularizer {
              weight: 3.9999998989515007e-05
            }
          }
          initializer {
            random_normal_initializer {
              mean: 0.0
              stddev: 0.009999999776482582
            }
          }
          activation: RELU_6
          batch_norm {
            decay: 0.996999979019165
            scale: true
            epsilon: 0.0010000000474974513
          }
        }
        depth: 128
        num_layers_before_predictor: 4
        kernel_size: 3
        class_prediction_bias_init: -4.599999904632568
        share_prediction_tower: true
        use_depthwise: true
      }
    }
    anchor_generator {
      multiscale_anchor_generator {
        min_level: 3
        max_level: 7
        anchor_scale: 4.0
        aspect_ratios: 1.0
        aspect_ratios: 2.0
        aspect_ratios: 0.5
        scales_per_octave: 2
      }
    }
    post_processing {
      batch_non_max_suppression {
        score_threshold: 9.99999993922529e-09
        iou_threshold: 0.6000000238418579
        max_detections_per_class: 100
        max_total_detections: 100
        use_static_shapes: false
      }
      score_converter: SIGMOID
    }
    normalize_loss_by_num_matches: true
    loss {
      localization_loss {
        weighted_smooth_l1 {
        }
      }
      classification_loss {
        weighted_sigmoid_focal {
          gamma: 2.0
          alpha: 0.25
        }
      }
      classification_weight: 1.0
      localization_weight: 1.0
    }
    encode_background_as_zeros: true
    normalize_loc_loss_by_codesize: true
    inplace_batchnorm_update: true
    freeze_batchnorm: false
  }
}
train_config {
  batch_size: 4
  data_augmentation_options {
    random_horizontal_flip {
    }
  }
  #data_augmentation_options {
    #random_crop_image {
      #min_object_covered: 0.0
      #min_aspect_ratio: 0.75
      #max_aspect_ratio: 3.0
      #min_area: 0.75
      #max_area: 1.0
      #overlap_thresh: 0.0
    #}
  #}
  optimizer {
    momentum_optimizer {
      learning_rate {
        cosine_decay_learning_rate {
          learning_rate_base: 0.04999999821186066
          total_steps: 50000
          warmup_learning_rate: 0.0026666000485420227
          warmup_steps: 600
        }
      }
      momentum_optimizer_value: 0.8999999761581421
    }
    use_moving_average: false
  }
  fine_tune_checkpoint: "pre-trained-models\ssd_mobilenet_v2_fpnlite_640x640_coco17_tpu-8\checkpoint\ckpt-0"
  num_steps: 50000
  startup_delay_steps: 0.0
  replicas_to_aggregate: 8
  max_number_of_boxes: 100
  unpad_groundtruth_tensors: false
  fine_tune_checkpoint_type: "detection"
  fine_tune_checkpoint_version: V2
  from_detection_checkpoint: true
}
train_input_reader {
  label_map_path: "annotations/label_map.pbtxt"
  tf_record_input_reader {
    input_path: "data/train.record"
  }
 
}
eval_config {
  metrics_set: "coco_detection_metrics"
  use_moving_averages: false
}
eval_input_reader {
  label_map_path: "annotations/label_map.pbtxt"
  shuffle: false
  num_epochs: 1
  tf_record_input_reader {
    input_path: "data/test.record"
  }
}

我已经用命令开始了训练:

python model_main_tf2.py --model_dir=models/my_ssd2_3/ --pipeline_config_path=models/my_ssd2_3/pipeline.config --sample_1_of_n_eval_examples 1 --logtostderr

我希望设置评估示例的数量会对开始评估工作产生影响。无论如何,我尝试在不同的终端窗口中运行评估:python model_main_tf2.py --model_dir=models/my_ssd2_3 --pipeline_config_path=models/my_ssd2_3/pipeline.config --checkpoint_dir=models/my_ssd2_3/ --alsologtostderr
一旦开始评估,训练作业就会因以下错误而崩溃:error

我认为我没有足够的硬件的问题:

  1. 8GB 内存
  2. 英伟达 GTX960M(2GB 内存)

我使用的所有输入图像都是 3000x3000 是否有问题,因此预处理器必须加载太多信息?如果是这样,有没有办法解决它?我不想在生成 TF 记录文件之前调整所有图像的大小,因为我必须重新标记所有图像。我显然缺乏在训练过程开始期间如何分配内存的洞察力,因此非常感谢一些细节。


第二个问题是,在 tensorboard 上监视训练期间,图像以各种亮度显示,我尝试将 model_lib_v2.py 文件中的 627 行更改为:
data= (features[fields.InputDataFields.image]-np.min(features[fields.InputDataFields.image]))/(np.max(features[fields.InputDataFields.image])-np.min(features[fields.InputDataFields.image]))
,

根据这个解决方案:https://github.com/tensorflow/models/issues/9115 没有任何运气。这个问题有解决方案吗?如果我可以在那里监视模型提出的边界框,那将是很好的。谢谢。

【问题讨论】:

    标签: python tensorflow object-detection object-detection-api custom-training


    【解决方案1】:

    通过对 model_lib.py 中的 train_loop 函数进行一些更改,您可以在同一应用程序中交替进行训练和评估。请参阅下面的示例。

    据我了解,Tensorflow 对象检测 API 的开发重点是分布式学习,如果您使用多个 GPU/TPU,那么您可以让一些设备进行训练,而其他设备进行评估。所以我怀疑 model_lib.py 目前的实现方式并不完全支持在同一设备上进行训练和评估。

    我不确定您看到的错误的根本原因,通常我看到 Tensorflow 在出现内存问题时会抛出 OOM 错误。可能是 Tensorflow 使用 CUDA 的方式不支持使用同一设备的两个应用程序。

    关于您的第二个问题,我遵循了here on the same thread 的建议,这对我有用。复制下面第三个代码块中的代码。最初,这似乎对我不起作用,因为我天真地更新了我创建的对象检测存储库中的文件,但是您的应用程序可能正在使用安装在您的站点库中的对象检测 API,因此我建议确认您正在更改的文件与导入语句中加载的文件相同。

    --

    这是在训练循环之外

      ##Set up evaluation data and writer
      eval_config = configs['eval_config']
      eval_input_configs = configs['eval_input_configs']
      eval_input_config = eval_input_configs[0]
      eval_input = strategy.experimental_distribute_dataset(
        inputs.eval_input(
            eval_config=eval_config,
            eval_input_config=eval_input_config,
            model_config=model_config,
            model=detection_model))
      
      summary_writer_eval = tf.compat.v2.summary.create_file_writer(os.path.join(model_dir, 'eval', eval_input_config.name))
    

    这是修改后的训练/评估循环。评估在接近尾声时进行。

    for _ in range(global_step.value(), train_steps, num_steps_per_iteration):
      
      tf.logging.info('Performing Training')
      with summary_writer_train.as_default():
        with tf.compat.v2.summary.record_if(lambda: global_step % num_steps_per_iteration == 0):
    
          losses_dict = _dist_train_step(train_input_iter)
    
          time_taken = time.time() - last_step_time
          last_step_time = time.time()
          steps_per_sec = num_steps_per_iteration * 1.0 / time_taken
    
          tf.compat.v2.summary.scalar(
              'steps_per_sec', steps_per_sec, step=global_step)
    
          steps_per_sec_list.append(steps_per_sec)
    
          logged_dict = losses_dict.copy()
          logged_dict['learning_rate'] = learning_rate_fn()
    
          for key, val in logged_dict.items():
            tf.compat.v2.summary.scalar(key, val, step=global_step)
    
          if global_step.value() - logged_step >= 0:
            logged_dict_np = {name: value.numpy() for name, value in
                              logged_dict.items()}
            tf.logging.info(
                'Step {} per-step time {:.3f}s'.format(
                    global_step.value(), time_taken / num_steps_per_iteration))
            tf.logging.info(pprint.pformat(logged_dict_np, width=40))
            print_gpu_memory_usage()
            logged_step = global_step.value()
    
          if ((int(global_step.value()) - checkpointed_step) >=
              checkpoint_every_n):
            manager.save()
            checkpointed_step = int(global_step.value())
            
      tf.logging.info('Performing Evaluation')
      with summary_writer_eval.as_default():
        eager_eval_loop(
            detection_model,
            configs,
            eval_input,
            use_tpu=use_tpu,
            global_step=global_step,
            )
    

    修复 TensorBoard 中的图像渲染

    if record_summaries:
        imgs = features[fields.InputDataFields.image][:3] 
        imgs = tf.div(tf.subtract(imgs, tf.reduce_min(imgs)), tf.subtract(tf.reduce_max(imgs), tf.reduce_min(imgs)))
        tf.compat.v2.summary.image(name='train_input_images', step=global_step, data=imgs, max_outputs=3)
    

    【讨论】:

    • 谢谢我确实在更改我创建的存储库中的文件。您是否建议对我的虚拟环境使用的存储库中的 model_lib_v2.py 进行这些更改?另外,我只需要在训练循环本身中进行更改,还是复制您在训练循环之前引用的部分?在我进行更改后,它返回此错误消息:“文件”C:\Users\Milan\anaconda3\envs\train1\lib\site-packages\object_detection\model_lib_v2.py”,第 689 行,在 train_loop 中,带有 summary_writer_train.as_default (): NameError: name 'summary_writer_train' is not defined" 谢谢@Chubbs
    • 关于错误,我发布的代码是定向的。我没有跟踪我为这个问题对 model_lib_v2 所做的确切更改。可能我将 summary_writer 更改为 summary_writer_train 以帮助将其与 summary_writer_eval 区分开来。这都在 train_loop 函数中,但实际的训练循环是 for 语句所在的位置以及之前的代码设置。
    • 我创建了model_lib_v2.py 文件的副本并将其放在工作区中,与我的model_main_tf2.py 文件位于同一目录中。您可能需要更改 model_main_tf2.py 中的 import 语句,Python 优先考虑从正在运行的脚本的同一目录中的模块导入,因此这允许您对 model_lib_v2.py 进行更改,而不会覆盖 site_libs 中安装的内容。例如,如果您要再次 pip 安装对象 api,则 site_libs 中的副本可能会被覆盖。这还允许您将更改作为项目的一部分进行版本控制。
    • 谢谢我能够同时运行训练和评估,我还可以看到亮度适当的训练和评估图片,虽然它们的分辨率看起来有点奇怪。
    猜你喜欢
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多