TensorFlow在自定义图像上训练CNN

时间:2017-10-16 15:30:21

标签: python tensorflow conv-neural-network mnist tensor

所有tensorflow教程都做得很好,但是,它们都使用开箱即用的预处理可下载数据集。他们关于MNIST的教程就是一个很好的例子 对于一个学校项目,我和其他4个人被指派以PNG图像的形式训练CNN提供的数据。它只是一个包含150张图像的目录。标签包含在图像文件名中。

代码的方式现在我们得到一个错误,我将在下面包含。

我们遵循此处的MNIST代码:https://github.com/tensorflow/tensorflow/blob/r1.3/tensorflow/examples/tutorials/layers/cnn_mnist.py

所以我们相当肯定我们的问题在于如何处理图像数据。 我们一直试图让它工作大约3天。 (我们已经解决了许多错误,这只是最新的错误)。

非常感谢任何帮助或反馈! 此外,如果有人对此有任何疑问,请发表评论。

import os

import tensorflow as tf
import numpy as np
#from PIL import Image


# a function
def cnn_model_fn(features,labels,mode):
    """Model function for CNN."""
    # Input Layer
    input_layer = tf.reshape(features['x'], [-1, 128, 128, 3])

    # Convolutional Layer #1
    conv_1 = tf.layers.conv2d(
        inputs=input_layer,
        filters=64,
        kernel_size=[7, 7],
        strides=2,
        padding="same",
        activation=tf.nn.relu)
    conv_2 = tf.layers.conv2d(
        inputs=conv_1,
        filters=128,
        kernel_size=[5, 5],
        padding="same",
        strides = 2,
        activation=tf.nn.relu)
    max_pool_1 = tf.layers.max_pooling2d(
        inputs = conv_2,
        pool_size = 3,
        strides = 1
    )
    conv_3 = tf.layers.conv2d(
        inputs=max_pool_1,
        filters=96,
        kernel_size=[3, 3],
        activation=tf.nn.relu
    )
    max_pool_2 = tf.layers.max_pooling2d(
        inputs = conv_3,
        pool_size = 2,
        strides = 1
    )
    dropout_1 = tf.layers.dropout(
        inputs = max_pool_2,
        rate=0.5
    )
    fully_connected_1 = tf.contrib.layers.fully_connected(
        inputs = dropout_1,
        num_outputs = 1024,

    )
    dropout_2 = tf.layers.dropout(
        inputs = fully_connected_1,
        rate=0.5
    )
    fully_connected_2 = tf.contrib.layers.fully_connected(
        inputs = dropout_2,
        num_outputs = 1024,

    )
    fully_connected_3 = tf.contrib.layers.fully_connected(
        inputs = fully_connected_2,
        num_outputs = 15,

    )
    softmax_layer = tf.contrib.layers.softmax(
        logits = fully_connected_3
    )
#------------------------------------------------------------------------MAIN--------------------------------------------------------------------------------------------------


def getLabels():

    imagelabels_arr = []

    image_files = os.listdir("../assets/CNN-Data/")

    for image in image_files:
        imagelabels_arr.append(image.split('.')[len(image.split('.'))-2])

    return imagelabels_arr


def getTrainImages():

    filenames = []

    image_files = os.listdir("../assets/CNN-Data/")

    for image in image_files:
        filenames.append(image)

    filename_queue = tf.train.string_input_producer(filenames)

    reader = tf.WholeFileReader()
    filename, content = reader.read(filename_queue)
    image = tf.image.decode_png(content, channels=3)
    images = np.asarray(image)
    image = tf.cast(image, tf.float64)
    resize_image = tf.image.resize_images(image, (128, 128))

   # image_batch = tf.train.batch([resize_image], batch_size=10)

    print(resize_image)
    return resize_image


with tf.Session() as sess:

    sess.run(tf.initialize_all_variables())

    classifier = tf.estimator.Estimator(
        model_fn=cnn_model_fn, model_dir="./test")

    train_input_fn = tf.estimator.inputs.numpy_input_fn(
          x={'x':np.array(getTrainImages())},
          y=np.array(getLabels()),
          batch_size=10,
          num_epochs=None,
          shuffle=True)

    classifier.train(
          input_fn=train_input_fn,
          steps=20,
          )

错误:

Traceback (most recent call last):
  File "CNN.py", line 134, in <module>
    steps=20,
  File "C:\Users\Tyler\Desktop\tensorFlowPratice\flowenv\lib\site-packages\tensorflow\python\estimator\estimator.py", line 241, in train
    loss = self._train_model(input_fn=input_fn, hooks=hooks)
  File "C:\Users\Tyler\Desktop\tensorFlowPratice\flowenv\lib\site-packages\tensorflow\python\estimator\estimator.py", line 628, in _train_model
    input_fn, model_fn_lib.ModeKeys.TRAIN)
  File "C:\Users\Tyler\Desktop\tensorFlowPratice\flowenv\lib\site-packages\tensorflow\python\estimator\estimator.py", line 499, in _get_features_and_labels_from_input_fn
    result = self._call_input_fn(input_fn, mode)
  File "C:\Users\Tyler\Desktop\tensorFlowPratice\flowenv\lib\site-packages\tensorflow\python\estimator\estimator.py", line 585, in _call_input_fn
    return input_fn(**kwargs)
  File "C:\Users\Tyler\Desktop\tensorFlowPratice\flowenv\lib\site-packages\tensorflow\python\estimator\inputs\numpy_io.py", line 109, in input_fn
    if len(set(v.shape[0] for v in ordered_dict_x.values())) != 1:
  File "C:\Users\Tyler\Desktop\tensorFlowPratice\flowenv\lib\site-packages\tensorflow\python\estimator\inputs\numpy_io.py", line 109, in <genexpr>
    if len(set(v.shape[0] for v in ordered_dict_x.values())) != 1:
IndexError: tuple index out of range

2 个答案:

答案 0 :(得分:0)

classifier.train函数需要numpy数组,但不是张量。因此,您需要通过使用会话评估它们来转换example_batch, label batch,而不是使用np.array()函数将它们包装起来。 (Explanation

sess.run(tf.initialize_all_variables())

tf.train.start_queue_runners(sess)

classifier = tf.estimator.Estimator(
    model_fn=cnn_model_fn, model_dir="./test")

train_input_fn = tf.estimator.inputs.numpy_input_fn(
      x={'x':getTrainImages().eval()},
      y=getLabels().eval(),
      batch_size=10,
      num_epochs=None,
      shuffle=True)

classifier.train(
      input_fn=train_input_fn,
      steps=20,
      )

答案 1 :(得分:-1)

我建议在tensorflow之上应用工具。您可以考虑通过roNNie,Theano,Keras,Torch或Caffe编写代码。