Tensorflow 如何在TF Slim';s eval_image_classifier.py?

Tensorflow 如何在TF Slim';s eval_image_classifier.py?,tensorflow,tf-slim,Tensorflow,Tf Slim,我正在使用TF Slim附带的一个工具来验证我训练过的模型。它工作正常,但我想得到一个错误分类文件的列表 脚本使用了,但即使在那里我也找不到任何打印错误分类文件的选项 我如何才能做到这一点?在高层次上,您需要做3件事: 1) 从数据加载程序获取文件名。如果您使用的是来自tfrecords的tf slim数据集,则文件名可能未存储在tfrecord中,因此您可能会遇到运气不佳的情况。但是,如果使用tf.WholeFileReader直接从文件系统中使用图像文件,则可以在形成批处理的位置获得文件名的

我正在使用TF Slim附带的一个工具来验证我训练过的模型。它工作正常,但我想得到一个错误分类文件的列表

脚本使用了,但即使在那里我也找不到任何打印错误分类文件的选项


我如何才能做到这一点?

在高层次上,您需要做3件事:

1) 从数据加载程序获取文件名。如果您使用的是来自tfrecords的tf slim数据集,则文件名可能未存储在tfrecord中,因此您可能会遇到运气不佳的情况。但是,如果使用tf.WholeFileReader直接从文件系统中使用图像文件,则可以在形成批处理的位置获得文件名的张量:

def load_data():
    train_image_names = ... # list of filenames
    filename_queue = tf.train.string_input_producer(train_image_names)
    reader = tf.WholeFileReader()
    image_filename, image_file = reader.read(filename_queue)
    image = tf.image.decode_jpeg(image_file, channels=3)

    .... # load your labels from somewhere

    return image_filename, image, label


 # in your eval code
 image_fn, image, label = load_data()

 filenames, images, labels = tf.train.batch(
                                [image_fn, image, label],
                                batch_size=32,
                                num_threads=2,
                                capacity=100,
                                allow_smaller_final_batch=True)
2) 进行推断后,用结果屏蔽文件名张量:

logits = my_network(images)
preds = tf.argmax(logits, 1)
mislabeled = tf.not_equal(preds, labels)
mislabeled_filenames = tf.boolean_mask(filenames, mislabeled)
3) 把这些都放到你的评估中:

eval_op = tf.Print(eval_op, [mislabeled_filenames])

slim.evaluation.evaluate_once(
                        .... # other options 
                        eval_op=eval_op,
                        .... # other options)

不幸的是,我没有测试这个的设置。让我知道它是否有效

shadow chris为我指出了正确的方向,因此我分享了我的解决方案,使其与TF记录数据集一起工作

为了更好的不稳定,我将我的代码与TF Slim的flower示例联系起来

1) 修改以在TF记录中存储文件名功能

  keys_to_features = {
      'image/encoded': tf.FixedLenFeature((), tf.string, default_value=''),
      'image/format': tf.FixedLenFeature((), tf.string, default_value='png'),
      'image/class/label': tf.FixedLenFeature(
          [], tf.int64, default_value=tf.zeros([], dtype=tf.int64)),
      'image/filename': tf.FixedLenFeature((), tf.string, default_value=''),
  }

  items_to_handlers = {
      'image': slim.tfexample_decoder.Image(),
      'label': slim.tfexample_decoder.Tensor('image/class/label'),
      'filename': slim.tfexample_decoder.Tensor('image/filename'),
  }
2) 将文件名参数添加到函数的
image\u to\u示例

然后它应该看起来像:

def image_to_tfexample(image_data, image_format, height, width, class_id, filename):
 return tf.train.Example(features=tf.train.Features(feature={
      'image/encoded': bytes_feature(image_data),
      'image/format': bytes_feature(image_format),
      'image/class/label': int64_feature(class_id),
      'image/height': int64_feature(height),
      'image/width': int64_feature(width),
      'image/filename': bytes_feature(filename)
  }))
3) 修改以保存文件名

将文件名输入TF记录

    example = dataset_utils.image_to_tfexample(
        image_data, 'jpg', height, width, class_id, filenames[i])
4) 在您的评估中,将错误分类的imgs映射到文件名

我指的是

使用tf.train.batch检索文件名:

images, labels, filenames = tf.train.batch(
    [image, label, filename],
    batch_size=FLAGS.batch_size,
    num_threads=FLAGS.num_preprocessing_threads,
    capacity=5 * FLAGS.batch_size)
获取错误分类的IMG并将其映射到文件名:

predictions = tf.argmax(logits, 1)
labels = tf.squeeze(labels)
mislabeled = tf.not_equal(predictions, labels)
mislabeled_filenames = tf.boolean_mask(filenames, mislabeled)
打印:

eval_op = tf.Print(eval_op, [mislabeled_filenames])

slim.evaluation.evaluate_once(
                        .... # other options 
                        eval_op=eval_op,
                        .... # other options)

谢谢你的回答。在使用tfrecords中的tf slim数据集时,我需要更改代码。一旦我有了新的信息,我会发布一个更新。我能够转移你处理tf记录的方法!我会接受你的回答并添加我的tf记录解决方案。