【问题标题】:Unable to load images for eval in tensorflow official resnet model无法在 tensorflow 官方 resnet 模型中加载用于 eval 的图像
【发布时间】:2018-10-13 01:57:15
【问题描述】:

我正在尝试在自己的图像和标签上训练 Tensorflow 官方 resnet 模型 (link)。
我创建了imagenet_main.py (my_data_main.py) 的副本,我在其中更改了与数据集相关的硬编码值,如下所示(我现在只是想让它适用于很少的图像):

"""Runs a ResNet model on the ImageNet dataset."""                             

  from __future__ import absolute_import                                         
  from __future__ import division                                                
  from __future__ import print_function                                          

  import os                                                                      
  import sys                                                                     

  import tensorflow as tf  # pylint: disable=g-bad-import-order                  

  from official.resnet import imagenet_preprocessing                             
  from official.resnet import resnet_model                                       
  from official.resnet import resnet_run_loop                                    

  _DEFAULT_IMAGE_SIZE = 299                                                      
  _NUM_CHANNELS = 3                                                              
  _NUM_CLASSES = 9                                                               

  # TODO: generate dynamically:                                                  
  _NUM_IMAGES = {                                                                
      'train': 484,                                                              
      'validation': 121,                                                         
  }                                                                                 

  _NUM_TRAIN_FILES = 2                                                              
  _NUM_VAL_FILES = 2                                                                
  _SHUFFLE_BUFFER = 200                            

###############################################################################
# Data processing                                                                 
###############################################################################
  def get_filenames(is_training, data_dir):                                         
      """Return filenames for dataset."""                                           
      if is_training:                                                               
          return [                                                               
            os.path.join(data_dir, 'my_data_train_%05d-of-%05d.tfrecord' % (i, _NUM_TRAIN_FILES))
                for i in range(_NUM_TRAIN_FILES)]                                  
      else:                                                                      
          return [                                                               
            os.path.join(data_dir, 'my_data_validation_%05d-of-%05d.tfrecord' % (i, _NUM_VAL_FILES))
                for i in range(_NUM_VAL_FILES)] 

# rest of program unchanged  

为了加载我的数据,我为我添加到 data_dir 目录~/Projects/my_data/data/images/ 的 train 和 eval 创建了 TFRecords。 然后我启动程序:

python3 my_data_main.py \
--data_dir ~/Projects/my_data/data/images/ \
--model_dir /tmp/tests \
--export_dir /tmp/exports \
--train_epochs 10 \
--max_train_steps 200 \
--epochs_between_evals 1 \
--batch_size 256 \
--multi_gpu \
--hooks LoggingTensorHook \
--num_parallel_calls 12  \
--inter_op_parallelism_threads 0 \
--intra_op_parallelism_threads 0 \
--dtype fp32 \
--export_dir /tmp/resnet \
--version 1 \
--resnet_size 18

问题:图像被正确加载以用于训练,但不能用于评估。 def resnet_model_fn开头的resnet_run_loop.py中的以下行将图像加载到Tensorboard中:

  # Generate a summary node for the images                                      
  tf.summary.image('images', features, max_outputs=6) 

我可以看到我的火车运行图像 但不适用于 Tensorboard 中的 eval

我检查的内容: 我检查了我的 TFRecords 是否已成功读取。 我查看了estimator.py 并打印了来自_get_features_and_labels_from_input_fn 的张量形状(在_evaluate_model 中调用)。我找不到任何问题。

我还没有做的事情
我目前正在下载完整的 imagenet 数据,试图找出他们准备数据的方式的不同之处。

在写这篇文章之前,我已尽力在网上找到答案。感谢大家的时间。

【问题讨论】:

    标签: tensorflow resnet


    【解决方案1】:

    @robieta on the github thread 回答了这个问题。在此处复制答案以供将来参考:

    我承认这把我扔了。看起来这是 TensorFlow 中的一个主动功能请求。 (https://github.com/tensorflow/tensorflow/issues/15332) 可以使用钩子来破解它。 (Tensorflow Estimator API save image summary in eval mode) 请注意 martinwicke 关于 eval 中摘要的警告。这是一个简单的例子:

    import tensorflow as tf
    
    
    def input_fn(*args, **kwargs):
      batch_size = 20
      images = tf.zeros((batch_size, 10), tf.float32)
      labels = tf.zeros((batch_size, 1), tf.int32)
      return tf.data.Dataset.from_tensors((images, labels)).repeat(10)
    
    def model_fn(features, labels, mode, params):
      pred = tf.layers.dense(inputs=features, units=1)
    
      if mode == tf.estimator.ModeKeys.TRAIN:
        loss = tf.losses.absolute_difference(labels, pred)
        tf.summary.scalar(name="train_scalar", tensor=1)
        optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1)
        return tf.estimator.EstimatorSpec(
            mode=tf.estimator.ModeKeys.TRAIN,
            loss=loss,
            train_op=optimizer.minimize(loss, tf.train.get_or_create_global_step()))
      if mode == tf.estimator.ModeKeys.EVAL:
        loss = tf.losses.absolute_difference(labels, pred)
        tf.summary.scalar(name="eval_scalar", tensor=2)
    
        # Use a hook to force evaluation. If commented out the scalar will not be saved.
        eval_summary_hook = tf.train.SummarySaverHook(
            save_steps=1,
            output_dir= "/tmp/summary_test/eval_core",
            summary_op=tf.summary.merge_all())
    
        return tf.estimator.EstimatorSpec(
            mode=tf.estimator.ModeKeys.EVAL,
            loss=loss,
            evaluation_hooks=[eval_summary_hook]
        )
    
    
    def main(_):
      model_dir = "/tmp/summary_test"
      if tf.gfile.Exists(model_dir):
        tf.gfile.DeleteRecursively(model_dir)
    
      run_config = tf.estimator.RunConfig(save_summary_steps=1)
    
      estimator = tf.estimator.Estimator(
          model_fn=model_fn,
          model_dir=model_dir,
          params={},
          config=run_config
      )
    
      for _ in range(10):
        estimator.train(input_fn=input_fn)
        estimator.evaluate(input_fn=input_fn)
    
    if __name__ == "__main__":
      main([])
    

    希望这会有所帮助,一旦评估对摘要有更好的支持,我肯定会默认保存更多评估信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-24
      • 2017-11-10
      • 1970-01-01
      • 1970-01-01
      • 2021-10-06
      • 2022-08-10
      • 2018-10-04
      • 1970-01-01
      相关资源
      最近更新 更多