wake-up-neo.com

Die Tensorflow CNN-Trainingsbilder sind alle unterschiedlich groß

Ich habe ein Deep Convolution Neural Network erstellt, um einzelne Pixel in einem Bild zu klassifizieren. Meine Trainingsdaten haben immer dieselbe Größe (32x32x7), meine Testdaten können jedoch beliebig groß sein.

Github Repository

Derzeit funktioniert mein Modell nur mit Bildern gleicher Größe. Ich habe den Tensorflow-Entwickler Tutorial ausführlich verwendet, um mir beim Aufbau meines Modells zu helfen. In diesem Lernprogramm werden nur 28 x 28 Bilder verwendet. Wie würde das folgende Mnist-Modell geändert, um Bilder beliebiger Größe zu akzeptieren?

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

Um die Sache etwas komplizierter zu gestalten, werden bei meinem Modell Faltungen umgesetzt, bei denen die Ausgabeform angegeben werden muss. Wie würde ich die folgende Codezeile anpassen, damit die transponierte Faltung eine Form ausgibt, die dieselbe Größe wie die Eingabe hat. 

  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

Leider gibt es keine Möglichkeit, dynamische Graphen in Tensorflow zu erstellen (Sie könnten es mit fold versuchen, aber das liegt außerhalb des Rahmens der Frage). Sie haben also zwei Möglichkeiten:

  1. Bucketing: Sie erstellen mehrere Eingabe-Tensoren in einigen handverlesenen Größen und wählen dann zur Laufzeit den richtigen Bucket (siehe Beispiel). So oder so brauchen Sie wahrscheinlich die zweite Option. Seq2seq mit Bucketing

  2. Ändern Sie die Größe der Eingabe- und Ausgabebilder. Wenn Sie davon ausgehen, dass alle Bilder das gleiche Seitenverhältnis beibehalten, können Sie versuchen, die Bildgröße zu ändern, bevor Sie sie ableiten. Nicht sicher, warum Sie sich für die Ausgabe interessieren, da MNIST eine Klassifizierungsaufgabe ist. 

So oder so können Sie den gleichen Ansatz verwenden:

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

Neben der Antwort von @ gidim können Sie die Größe der Bilder in Tensorflow ändern und die Ergebnisse direkt Ihrer Schlussfolgerung zuführen. Hinweis: Bei dieser Methode wird das Bild skaliert und verzerrt, was den Verlust erhöhen kann.

Alle Gutschriften gehen an Prasad Pais Artikel zur Datenerhöhung .

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

Der von Ihnen erwähnte Mnist-Modellcode ist ein Beispiel für FC-Netzwerke und nicht für Faltungsnetzwerke. Die Eingabeform von [Keine, 784] wird für die Mistengröße (28 x 28) angegeben. Das Beispiel ist ein FC-Netzwerk mit fester Eingangsgröße.

Das, wonach Sie fragen, ist in FC-Netzwerken nicht möglich, da die Anzahl der Gewichte und Vorspannungen von der Eingabeform abhängt. Dies ist möglich, wenn Sie eine Fully-Faltungsarchitektur verwenden. Mein Vorschlag ist also, eine vollständig gefaltete Architektur zu verwenden, damit die Gewichte und Vorspannungen nicht von der Eingabeform abhängen 

0
Abhijit Balaji