无法在 tensorflow 官方 resnet 模型中加载用于 eval 的图像

Posted

技术标签:

【中文标题】无法在 tensorflow 官方 resnet 模型中加载用于 eval 的图像【英文标题】:Unable to load images for eval in tensorflow official resnet model 【发布时间】: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 数据,试图找出他们准备数据的方式的不同之处。

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

【问题讨论】:

【参考方案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([])

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

【讨论】:

以上是关于无法在 tensorflow 官方 resnet 模型中加载用于 eval 的图像的主要内容,如果未能解决你的问题,请参考以下文章

将预训练的 inception_resnet_v2 与 Tensorflow 结合使用

图像分类手撕ResNet——复现ResNet(Keras,Tensorflow 2.x)

ResNet RGB 表示在 tensorflow-slim

ResNet实战:tensorflow2.X版本,ResNet50图像分类任务(大数据集)

tensorflow benchmark 基准测试

TensorFlow2 千层神经网络, 始步于此 --ResNet 实现