2017-10-16 16 views
0

Tous les didacticiels tensorflow font un excellent travail, mais ils utilisent tous des jeux de données téléchargeables pré-traités qui fonctionnent immédiatement. Leur tutoriel sur MNIST est l'exemple parfait.
Pour un projet d'école, 4 autres personnes et moi-même avons été affectés à la formation d'un CNN sur des données fournies sous forme d'images PNG. C'est juste un répertoire avec 150 images. Les étiquettes sont contenues dans les noms de fichier d'image.Formation CNN TensorFlow sur les images personnalisées

La façon dont les codes se trouve maintenant, nous obtenons une erreur que je vais inclure ci-dessous.

Nous avons suivi le code MNIST trouvé ici: https://github.com/tensorflow/tensorflow/blob/r1.3/tensorflow/examples/tutorials/layers/cnn_mnist.py

donc nous sommes assez certain que notre problème est dans la façon dont nous avons traité les données d'image. Nous avons essayé de faire fonctionner cela pendant environ 3 jours. (Beaucoup d'erreurs que nous avons traitées, c'est juste la dernière).

Toute aide ou réaction serait grandement appréciée! En outre, si quelqu'un a des questions à ce sujet s'il vous plaît commenter.

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

L'erreur:

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

Je ne sais pas grand-chose à propos de l'API 'Estimator', mais ne devrait pas' cnn_model_fn' retourner quelque chose? – jdehesa

+0

Oui, vous avez raison. Si nous ajoutons l'instruction return que le code MNIST utilise, nous obtenons la même erreur. –

+0

Que montre l'instruction 'print (resize_image)'? (ou est-ce qu'il ne fonctionne pas à ce point?) Aussi notes: 1) il n'affecte pas le programme, mais 'images = np.asarray (image)' n'a pas de sens ... 'image' est un tenseur TF , pas NumPy 2) peut-être ce que vous voulez est 'image = tf.cast (image/255.0, tf.float64)'? (pour avoir des valeurs de pixel dans [0, 1]) – jdehesa

Répondre

0

fonction classifier.train attend des tableaux numpy, mais pas tenseurs. Par conséquent, vous devez convertir example_batch, label batch en les évaluant avec une session, mais sans les encapsuler en utilisant la fonction 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, 
    )