【问题标题】:TensorFlow: Train model on a custom image datasetTensorFlow:在自定义图像数据集上训练模型
【发布时间】:2017-12-11 22:54:03
【问题描述】:

我有兴趣在自己的一组图像上训练和评估卷积神经网络模型。我想使用tf.layers 模块来定义我的模型,并使用tf.learn.Estimator 对象分别使用fit() 和evaluate() 方法来训练和评估模型。

Here 是我一直关注的教程,有助于展示tf.layers 模块和tf.learn.Estimator 类。但是,它使用的数据集 (MNIST) 只是简单地导入和加载(作为 NumPy 数组)。请参阅教程脚本中的以下主要功能:

def main(unused_argv):
  # Load training and eval data
  mnist = learn.datasets.load_dataset("mnist")
  train_data = mnist.train.images  # Returns np.array
  train_labels = np.asarray(mnist.train.labels, dtype=np.int32)
  eval_data = mnist.test.images  # Returns np.array
  eval_labels = np.asarray(mnist.test.labels, dtype=np.int32)

  # Create the Estimator
  mnist_classifier = learn.Estimator(
      model_fn=cnn_model_fn, model_dir="/tmp/mnist_convnet_model")

  # Set up logging for predictions
  # Log the values in the "Softmax" tensor with label "probabilities"
  tensors_to_log = {"probabilities": "softmax_tensor"}
  logging_hook = tf.train.LoggingTensorHook(
      tensors=tensors_to_log, every_n_iter=50)

  # Train the model
  mnist_classifier.fit(
      x=train_data,
      y=train_labels,
      batch_size=100,
      steps=20000,
      monitors=[logging_hook])

  # Configure the accuracy metric for evaluation
  metrics = {
      "accuracy":
          learn.MetricSpec(
              metric_fn=tf.metrics.accuracy, prediction_key="classes"),
  }

  # Evaluate the model and print results
  eval_results = mnist_classifier.evaluate(
      x=eval_data, y=eval_labels, metrics=metrics)
  print(eval_results)

完整代码here


我有自己的图片,在某个目录结构中我有jpg 格式:

data
    train
        classA
            1.jpg
            2.jpg
            ...
        classB
            3.jpg
            4.jpg
            ...
        ...
    validate
        classA
            5.jpg
            6.jpg
            ...
        classB
            ...
        ...

我也将我的图像目录转换为 TFRecord 格式,一个 TFRecord 文件用于train,一个用于validation。我遵循了this 教程,该教程使用 TensorFlow 附带的 Inception 模型中的 build_image_data.py 脚本作为输出这些 TFRecord 文件的黑盒。我承认通过创建这些我可能有点本末倒置,但我认为也许有一种方法可以将这些用作tf.learn.Estimator 的fit() 和evaluate() 方法的输入。


问题

如何格式化我的jpg(或 TFRecord)数据,以便我可以将它们用作Estimator 对象函数的输入?

我假设我必须将图像和标签转换为 NumPy 数组,如上面的代码所示,但是尚不清楚 mnist.train.images 和 mnist.train.validation 的格式。

有没有人将jpg 文件和标签转换为这个Estimator 类期望作为输入的NumPy 数组?

任何帮助将不胜感激。

【问题讨论】:

标签: python numpy tensorflow neural-network conv-neural-network


【解决方案1】:

您引用的文件cnn_mnist.py,特别是以下函数mnist_classifier.fit,需要Numpy 数组作为x 和y 的输入。因此,我将解决您的第二个和第三个问题,因为 TFRecords 可能不容易合并到引用的代码中。

但是,不清楚 mnist.train.images 和 mnist.train.validation 是如何格式化的

mnist.train.images 是一个形状为 (55000, 784) 的 Numpy 数组,其中 55000 是图像的数量,784 是每个展平图像的尺寸 (28 x 28)。 mnist.validation.images 也是一个形状为 (5000, 784) 的 Numpy 数组。

有没有人有将 jpg 文件和标签转换为这个 Estimator 类期望作为输入的 NumPy 数组的经验?

以下代码将一张 JPEG 图像作为 3 维 Numpy 数组读入:

    from scipy.misc import imread
    filename = '1.jpg'
    np_1 = imread(filename)

考虑到您已经从该数据集生成了 TFRecords 文件,我假设所有这些图像的大小相同,或者您可以将它们调整为相同大小。剩下要做的就是展平图像,迭代读取其他图像并展平它们,然后垂直堆叠所有图像。这个对象可以输入到Estimator 函数中。

以下是展平和垂直堆叠两个 3D Numpy 数组的代码:

    import numpy as np
    np_1_2 = np.vstack((np_1.flatten(), np_2.flatten()))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    • 2016-09-05
    • 2021-08-30
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    相关资源
    最近更新 更多