2

Ich bin daran interessiert, ein konvolutionelles neuronales Netzmodell auf meinen eigenen Bildern zu trainieren und auszuwerten. Ich möchte das Modul tf.layers für meine Modelldefinition zusammen mit einem Objekt verwenden, um das Modell mit den Methoden fit() bzw. evaluate() zu trainieren und zu bewerten.TensorFlow: Train-Modell für einen benutzerdefinierten Bilddatensatz

Here ist das Tutorial, dem ich gefolgt bin, das hilfreich ist, um das tf.layers Modul und die tf.learn.Estimator Klasse zur Schau zu stellen. Das von ihm verwendete Dataset (MNIST) wird jedoch einfach importiert und geladen (als NumPy-Arrays). Siehe die folgende Hauptfunktion aus dem Tutorial-Skript:

def main(unused_argv): 
    # Load training and eval data 
    mnist = learn.datasets.load_dataset("mnist") 
    train_data = mnist.train.images # Returns np.array 
    train_labels = np.asarray(mnist.train.labels, dtype=np.int32) 
    eval_data = mnist.test.images # Returns np.array 
    eval_labels = np.asarray(mnist.test.labels, dtype=np.int32) 

    # Create the Estimator 
    mnist_classifier = learn.Estimator(
     model_fn=cnn_model_fn, model_dir="/tmp/mnist_convnet_model") 

    # Set up logging for predictions 
    # Log the values in the "Softmax" tensor with label "probabilities" 
    tensors_to_log = {"probabilities": "softmax_tensor"} 
    logging_hook = tf.train.LoggingTensorHook(
     tensors=tensors_to_log, every_n_iter=50) 

    # Train the model 
    mnist_classifier.fit(
     x=train_data, 
     y=train_labels, 
     batch_size=100, 
     steps=20000, 
     monitors=[logging_hook]) 

    # Configure the accuracy metric for evaluation 
    metrics = { 
     "accuracy": 
      learn.MetricSpec(
       metric_fn=tf.metrics.accuracy, prediction_key="classes"), 
    } 

    # Evaluate the model and print results 
    eval_results = mnist_classifier.evaluate(
     x=eval_data, y=eval_labels, metrics=metrics) 
    print(eval_results) 

Voll Code here


Ich habe meine eigenen Bilder, die ich in beiden jpg Format innerhalb einer bestimmten Verzeichnisstruktur haben:

data 
    train 
     classA 
      1.jpg 
      2.jpg 
      ... 
     classB 
      3.jpg 
      4.jpg 
      ... 
     ... 
    validate 
     classA 
      5.jpg 
      6.jpg 
      ... 
     classB 
      ... 
     ... 

Und ich habe auch meine Bildverzeichnisse in TFRecord-Format mit einer TFRecord-Datei für train und eine für 012 konvertiert. Ich folgte this Tutorial, das das build_image_data.py Skript aus dem Inception-Modell verwendet, das mit TensorFlow als Blackbox kommt, die diese TFRecord-Dateien ausgibt. Ich gebe zu, dass ich den Wagen vielleicht etwas vor das Pferd gestellt habe, indem ich diese erstellt habe, aber ich dachte, dass es vielleicht einen Weg gibt, diese als Eingaben für die tf.learn.Estimatorfit() und evaluate() Methoden zu verwenden.


Fragen

Wie kann ich meine jpg formatieren (oder TFRecord) Daten, so dass ich sie als Eingaben in das Estimator Funktionen des Objekts nicht verwenden kann?

Ich gehe davon aus, dass ich meine Bilder und Etiketten zu NumPy-Arrays konvertieren muss, wie es im obigen Code zeigt, aber es ist nicht klar, wie die mnist.train.images und mnist.train.validation formatiert sind.

Hat jemand Erfahrung mit der Konvertierung von jpg Dateien und Labels zu NumPy-Arrays, die diese Estimator Klasse als Eingaben erwartet?

Jede Hilfe würde sehr geschätzt werden.

+1

Ich weiß, die Frage nach Tensorflow ist (und ich versuche zu finden, wie dies in Tensorflow zu tun), aber diese ist sehr einfach in PyTorch zu tun: https://github.com/pytorch/vision#imagefolder – finbarr

+1

Diese Antwort könnte für Sie nützlich sein: https://stackoverflow.com/questions/34340489/tensorflow-read-images-with- Etiketten – finbarr

Antwort

2

Die Datei, die Sie verwiesen haben, cnn_mnist.py und insbesondere die folgende Funktion mnist_classifier.fit erfordert Numpy Arrays als Eingabe für x und y. Daher werde ich auf Ihre zweite und dritte Frage eingehen, da TFRecords nicht ohne weiteres in den referenzierten Code aufgenommen werden kann.

ist es jedoch nicht klar, wie die mnist.train.images und mnist.train.validation

formatiert sind mnist.train.images wird ein Array mit Numpy Form (55000, 784), wobei 55000 ist Anzahl der Bilder und 784 ist die Dimension jedes abgeflachten Bildes (28 x 28). mnist.validation.images ist auch ein Numpy-Array mit Form (5000, 784).

Hat jemand Erfahrung mit der Konvertierung von jpg-Dateien und Labels in NumPy-Arrays, die diese Estimator-Klasse als Eingaben erwartet?

Der folgende Code liest in einem JPEG-Bild als ein dreidimensionales Numpy Array:

from scipy.misc import imread 
    filename = '1.jpg' 
    np_1 = imread(filename) 

Ich nehme alle diese Bilder die gleiche Größe haben, oder dass Sie in der Lage, sie auf die gleiche Größe ändern Größe, wenn Sie bereits TFRocords-Dateien aus diesem Dataset generiert haben. Alles, was noch zu tun ist, ist, das Bild zu glätten, die anderen Bilder iterativ einzulesen und sie zu glätten und dann alle Bilder vertikal zu stapeln. Dieses Objekt kann in die Estimator Funktion eingegeben werden.

Im Folgenden finden Sie den Code zu glätten und vertikal stapeln zwei dreidimensionale Numpy Arrays:

import numpy as np 
    np_1_2 = np.vstack((np_1.flatten(), np_2.flatten())) 
Verwandte Themen