2017-10-16 163 views
0

所有tensorflow教程都做得非常好,但是他们都使用预先处理的可下载数据集,这些数据集可以直接使用。他们在MNIST上的教程就是一个很好的例子。
对于一个学校项目,其他4个人和我被分配到以PNG图像的形式对所提供的数据进行CNN培训。这只是一个包含150张图片的目录。标签包含在图像文件名称中。TensorFlow在自定义图像上培训CNN

代码的坐标现在我们得到一个错误,我将在下面包括。

我们跟着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 
+0

我不知道太多关于'Estimator' API,但不应'cnn_model_fn'返回的东西? – jdehesa

+0

是的,你是对的。如果我们添加MNIST代码使用的return语句,我们会得到相同的错误。 –

+0

'print(resize_image)'显示的语句是什么? (或者它没有运行到那个点?)另外,注意:1)它不影响程序,但'images = np.asarray(image)'没有意义...'image'是一个TF张量,而不是NumPy 2)也许你想要的是'image = tf.cast(image/255.0,tf.float64)'? (在[0,1]中有像素值) – jdehesa

回答

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, 
    )