22

Deep Learning wurde erfolgreich auf mehrere große Datensätze für die Klassifizierung einer Handvoll Klassen (Katzen, Hunde, Autos, Flugzeuge, etc.), mit Leistungen schlagen einfachere Deskriptoren wie Taschen von Features über SIFT, Farbhistogramme etc.Extrahieren Funktionen mit vortrainiert (Tensorflow) CNN

Dennoch erfordert das Training eines solchen Netzwerkes eine Menge Daten pro Klasse und viel Trainingszeit. Allerdings hat man oft nicht genug Daten oder möchte nur eine Vorstellung davon bekommen, wie gut ein konvolutionelles neuronales Netzwerk funktioniert, bevor man Zeit benötigt, um ein solches Gerät zu entwerfen und zu trainieren und die Trainingsdaten zu sammeln.

In diesem speziellen Fall ist es möglicherweise ideal, ein Netzwerk mit einigen Benchmark-Datensätzen zu konfigurieren und zu trainieren, die von den hochmodernen Veröffentlichungen verwendet werden, und es einfach auf einige Datensätze anzuwenden, die Sie als Funktion haben könnten Extraktor.

Daraus ergibt sich eine Reihe von Features für jedes Bild, das man zu einem klassischen Klassifikationsverfahren wie SVM ist, logistische Regression, neuronale Netze speisen könnte, usw.

Insbesondere dann, wenn man nicht genügend Daten zu trainieren der CNN, ich kann erwarten, dass dies eine Pipeline übertrifft, in der der CNN an wenigen Proben trainiert wurde.

Ich habe mir die Tensorflow-Tutorials angesehen, aber sie scheinen immer eine klare Trainings-/Testphase zu haben. Ich konnte keine Pickle-Datei (oder ähnliches) mit einem vorkonfigurierten CNN-Feature-Extraktor finden.

Meine Fragen sind: Sind solche vortrainierten Netzwerke vorhanden und wo finde ich sie? Alternativ: Macht dieser Ansatz Sinn? Wo kann ich CNN + Gewichte finden?

BEARBEITEN W.r.t. @ John Kommentar habe ich versucht, 'DecodeJpeg:0' und 'DecodeJpeg/contents:0' und überprüft die Ausgänge verwenden, die unterschiedlich sind (: S)

import cv2, requests, numpy 
import tensorflow.python.platform 
import tensorflow as tf 


response = requests.get('https://i.stack.imgur.com/LIW6C.jpg?s=328&g=1') 
data = numpy.asarray(bytearray(response.content), dtype=np.uint8) 
image = cv2.imdecode(data,-1) 

compression_worked, jpeg_data = cv2.imencode('.jpeg', image) 
if not compression_worked: 
    raise Exception("Failure when compressing image to jpeg format in opencv library") 
jpeg_data = jpeg_data.tostring() 

with open('./deep_learning_models/inception-v3/classify_image_graph_def.pb', 'rb') as graph_file: 
    graph_def = tf.GraphDef() 
    graph_def.ParseFromString(graph_file.read()) 
    tf.import_graph_def(graph_def, name='') 

with tf.Session() as sess: 
    softmax_tensor = sess.graph.get_tensor_by_name('pool_3:0') 

    arr0 = numpy.squeeze(sess.run(
     softmax_tensor, 
     {'DecodeJpeg:0': image} 
    )) 

    arr1 = numpy.squeeze(sess.run(
     softmax_tensor, 
     {'DecodeJpeg/contents:0': jpeg_data} 
    )) 

    print(numpy.abs(arr0 - arr1).max()) 

So ist die maximale absolute Differenz 1.27649, und alle Elemente im Allgemeinen unterscheiden sich (vor allem seit dem Durchschnitt Wert der arr0 und arr1 selbst liegt zwischen 0 - 0,5).

Ich würde auch erwarten, dass 'DecodeJpeg:0' braucht eine jpeg-Zeichenfolge, kein numpy Array, warum sonst enthält der Name 'Jpeg'. @John: Könnten Sie sagen, wie Sie sicher über Ihren Kommentar sind?

Also ich bin mir nicht sicher, was ist was, wie ich erwarten würde, dass ein trainiertes neuronales Netzwerk deterministisch (aber höchstens chaotisch) ist.

+0

Rubber duck: wenn googeln auf "CNN trainiert auf ImageNet", fand ich das: http://www.vlfeat.org/matconvnet/pretrained/ – Herbert

+1

Ich konnte dieses Netzwerk auf meinem Laptop kompilieren und ausführen - und das verwenden Webcam zum Identifizieren/Klassifizieren von Bildern github.com/sermanet/OverFeat –

Antwort

18

Das TensorFlow-Team hat kürzlich einen tiefen CNN veröffentlicht, der auf dem ImageNet-Datensatz geschult wurde. Sie können das Skript herunterladen, das die Daten (einschließlich der Modellgrafik und der trainierten Gewichte) von here abruft. Die zugehörige Image Recognition tutorial enthält weitere Details zum Modell.

Während das aktuelle Modell nicht speziell verpackt in einem nachfolgenden Trainingsschritt verwendet werden, können Sie das Skript modifizieren erkunden Teile des Modells und die trainierten Gewichte im eigenen Netzwerk wieder zu verwenden.

+0

Das scheint genial, wenn ich es funktioniere, werde ich akzeptieren :) classify_image schlägt vor, dass es zu einem Label führt. Ich möchte einen Feature-Vektor, da meine Labels nicht von ImageNet stammen. – Herbert

+4

Verwenden Sie diese Kommentare wie durch log: Annahme, 'softmax_tensor = sess.graph.get_tensor_by_name ('pool_3: 0')' anstelle von 'softmax_tensor = sess.graph.get_tensor_by_name ('softmax: 0')', um Funktionen zu erhalten. – Herbert

+0

Ich habe festgestellt, dass das 'feed_dict' dieses speziellen Netzwerkes ein' 'DecodeJpeg/contents: 0'' hat (ich denke, das ist in der Datei' classify_image_graph_def.pb' definiert), wüsstest du, wie man die möglichen feed_dict-Konfigurationen herausfinden kann Sind möglich? Kann ich auch ein numpy-array mit dem Bild hineinwerfen? – Herbert

Verwandte Themen