无法在tensorflow官方resnet模型

时间:2018-05-02 20:54:03

标签: tensorflow resnet

我试图在我自己的图像和标签上训练Tensorflow官方的resnet模型(link)。
我创建了imagenet_main.pymy_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  

为了加载我的数据,我创建了TFRecords for train and eval,我将其添加到data_dir目录~/Projects/my_data/data/images/。 然后我用:

启动程序
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

问题:正确加载图像以进行培训,但不进行评估。 resnet_run_loop.py开头的def resnet_model_fn中的以下行会在Tensorboard中加载图片:

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

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

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

我尚未完成的事
我目前正在下载完整的imagenet数据,试图找到他们准备数据的方式上的差异。

在我写这篇文章之前,我尽力在网上找到答案。欣赏每个人的时间。

1 个答案:

答案 0 :(得分:0)

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

  

我会承认这个人把我扔了。看起来这是TensorFlow中的活动功能请求。 (https://github.com/tensorflow/tensorflow/issues/15332)使用钩子可以破解它。 (Tensorflow Estimator API save image summary in eval mode)请注意马丁威克关于摘要在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([])
  

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