web-dev-qa-db-fra.com

Les images de formation Tensorflow CNN sont toutes de tailles différentes

J'ai créé un réseau de neurones à convolution profonde pour classer des pixels individuels dans une image. Mes données d'entraînement auront toujours la même taille (32x32x7), mais mes données de test peuvent avoir n'importe quelle taille.

Dépôt Github

Actuellement, mon modèle ne fonctionne que sur des images de la même taille. J'ai utilisé le mniste tensorflow tutorial largement pour m'aider à construire mon modèle. Dans ce tutoriel, nous n'utilisons que des images 28x28. Comment le modèle mniste suivant pourrait-il être modifié pour accepter des images de toute taille?

 x = tf.placeholder(tf.float32, shape=[None, 784])
 y_ = tf.placeholder(tf.float32, shape=[None, 10])
 W = tf.Variable(tf.zeros([784,10]))
 b = tf.Variable(tf.zeros([10]))
 x_image = tf.reshape(x, [-1, 28, 28, 1])

Pour compliquer un peu les choses, mon modèle dispose de convolutions de transposition dans lesquelles la forme de la sortie doit être spécifiée. Comment ajusterais-je la ligne de code suivante de sorte que la convolution transposée produise une forme de la même taille que l'entrée? 

  DeConnv1 = tf.nn.conv3d_transpose(layer1, filter = w, output_shape = [1,32,32,7,1], strides = [1,2,2,2,1], padding = 'SAME')     
10
Devin Haslam

Malheureusement, il n’existe aucun moyen de créer des graphiques dynamiques dans Tensorflow (vous pouvez essayer avec fold mais cela n’entre pas dans le cadre de la question). Cela vous laisse deux options:

  1. Bucketing: vous créez plusieurs tenseurs d'entrée dans quelques tailles choisies à la main, puis au moment de l'exécution, vous choisissez le bon compartiment (voir exemple). De toute façon, vous aurez probablement besoin de la deuxième option. Seq2seq avec seau

  2. Redimensionner les images d'entrée et de sortie . En supposant que les images conservent toutes le même aspect, vous pouvez essayer de redimensionner l'image avant l'inférence. Vous ne savez pas pourquoi vous vous souciez de la sortie puisque MNIST est une tâche de classification. 

De toute façon, vous pouvez utiliser la même approche:

from PIL import Image

basewidth = 28 # MNIST image width
img = Image.open('your_input_img.jpg')
wpercent = (basewidth/float(img.size[0]))
hsize = int((float(img.size[1])*float(wpercent)))
img = img.resize((basewidth,hsize), Image.ANTIALIAS)

# Save image or feed directly to tensorflow 
img.save('feed_to_tf.jpg') 
5
gidim

Ajoutant à @gidim's réponse , voici comment redimensionner les images dans Tensorflow et transmettre les résultats directement à votre inférence. Remarque: cette méthode met à l'échelle et déforme l'image, ce qui peut augmenter votre perte.

Tout le mérite revient à article de Prasad Pai sur l’augmentation des données .

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

IMAGE_SIZE = 32
CHANNELS = 1

def tf_resize_images(X_img_file_paths):
    X_data = []
    tf.reset_default_graph()
    X = tf.placeholder(tf.float32, (None, None, CHANNELS))
    tf_img = tf.image.resize_images(X, (IMAGE_SIZE, IMAGE_SIZE), 
                                    tf.image.ResizeMethod.NEAREST_NEIGHBOR)
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())

        # Each image is resized individually as different image may be of different size.
        for index, file_path in enumerate(X_img_file_paths):
            img = Image.open(file_path)
            resized_img = sess.run(tf_img, feed_dict = {X: img})
            X_data.append(resized_img)

    X_data = np.array(X_data, dtype = np.float32) # Convert to numpy
    return X_data
0
RafazZ

Le code de modèle mnist que vous avez mentionné est un exemple utilisant des réseaux FC et non des réseaux de convolution. La forme en entrée de [Aucun, 784] est donnée pour la taille de la liste de noms (28 x 28). L'exemple est un réseau FC qui a une taille d'entrée fixe.

Ce que vous demandez n'est pas possible dans les réseaux FC, car le nombre de poids et de biais dépend de la forme de l'entrée. Cela est possible si vous utilisez une architecture de convolution complète. Donc, ma suggestion est d'utiliser une architecture à convolution complète afin que les poids et les biais ne dépendent pas de la forme d'entrée 

0
Abhijit Balaji