TensorFlow:在自定义图像数据集上训练模型

时间:2017-07-07 15:11:28

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

我对在我自己的图像集上训练和评估卷积神经网络模型感兴趣。我想使用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的{​​{1}} fit()和{{1}的输入方法。

问题

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

我假设我必须将我的图像和标签转换为NumPy数组,如上面的代码中所示,但是,不清楚Estimatormnist.train.images是如何格式化的。< / p>

有没有人有将mnist.train.validation文件和标签转换为此jpg类期望作为输入的NumPy数组的经验?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

您引用的文件cnn_mnist.py,特别是以下函数mnist_classifier.fit,需要Numpy数组作为xy的输入。因此,我将解决您的第二和第三个问题,因为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图像读入三维Numpy数组:

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

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

下面是展平和垂直堆叠两个三维Numpy数组的代码:

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