Google Deep Dream art: Wie man eine Schicht in einem neuronalen Netzwerk auswählt und verbessert

8

Ich bin an einem kürzlich veröffentlichten Blogbeitrag von Google interessiert, in dem die Verwendung von nn zur Herstellung von Kunst beschrieben wird.

Ich bin besonders an einer Technik interessiert:

  

'In diesem Fall füttern wir das Netzwerk einfach mit einem beliebigen Bild oder Foto und lassen das Netzwerk das Bild analysieren. Wir wählen dann eine Ebene und bitten das Netzwerk, alles zu verbessern, was es entdeckt hat. Jede Ebene des Netzwerks befasst sich mit Funktionen auf einer anderen Abstraktionsebene. Daher hängt die Komplexität der von uns erzeugten Features davon ab, welche Ebene wir verbessern möchten. Zum Beispiel neigen niedrigere Schichten dazu, Striche oder einfache ornamentartige Muster zu erzeugen, weil diese Schichten empfindlich auf grundlegende Merkmale wie Kanten und deren Ausrichtung reagieren.

Der Beitrag ist Ссылка .

Meine Frage : Der Post beschreibt dies als einen "einfachen" Fall - gibt es eine Open-Source-Implementierung eines nn, die zu diesem Zweck in einem relativ plug-and-play verwendet werden könnte verarbeiten? Nur für die beschriebene Technik, muss das Netzwerk trainiert werden?

Zweifelsohne braucht man für andere in der Arbeit erwähnte Techniken ein Netzwerk, das bereits auf einer großen Anzahl von Bildern trainiert wurde, aber für das eine, das ich beschrieben habe, gibt es bereits eine Art Open-Source-Netzwerkschicht-Visualisierungspaket?

>     
user86895 23.06.2015, 05:32
quelle

2 Antworten

8

UPD: Google hat ausführlichere Anweisungen zur Implementierung veröffentlicht: Ссылка

Es gibt auch ein anderes Projekt: Ссылка

Wenn Sie 1 , [2], [3], [4] von Ihrem Link lesen, werden Sie Ich werde sehen, dass sie Caffe benutzt haben. Dieses Framework enthält bereits die trainierten Netzwerke zum Spielen. Sie müssen nichts manuell trainieren, laden Sie einfach die Modelle mit den .sh-Skripten im Ordner models/ herunter.

Sie wollen einen "Plug-and-Play-Prozess", es ist nicht so einfach, denn neben dem Framework benötigen wir den Code der Skripte, die sie verwendet haben, und wahrscheinlich Caffe. Ich habe versucht, etwas mit ihrer Beschreibung zu machen. Caffe hat Python und Matlab-Schnittstelle, aber es gibt mehr in seinen Interna.

Der folgende Text beschreibt meine Gedanken darüber, wie es möglicherweise umgesetzt werden könnte. Ich bin nicht sicher über meine Worte, es ist eher eine Einladung, mit mir zu recherchieren als der "Plug-and-Play-Prozess". Aber da noch niemand geantwortet hat, lasst es mich hier niederlegen. Vielleicht wird mich jemand reparieren.

Also

Soweit ich verstehe, führen sie Optimierung

[sum((net.forwardTo(X, n) - enchanced_layer).^2) + lambda * R(X)] -> min

i.e. Suchen Sie nach einer solchen Eingabe X , so dass die bestimmte Ebene des Netzwerkworts die "enchanced" -Daten anstelle der "ursprünglichen" Daten erzeugen würde.

Es gibt eine Regularisierungsbeschränkung R(X) : X sollte wie "natürliches Bild" aussehen (ohne hochfrequentes Rauschen).

X ist unser Zielbild. Der Anfangspunkt X0 ist das Originalbild. forwardTo(X, n) ist das, was unser Netzwerk in der Ebene n erzeugt, wenn wir die Eingabe mit X füttern. Wenn Sie über Caffe sprechen, können Sie einen vollständigen Weiterleitungsdurchlauf ( net.forward ) vornehmen und sich den gewünschten Blob ansehen ( net.blob_vec(n).get_data() ).

enchanced_layer - wir nehmen die Original-Layer-Blob- und "Enhancement" -Signale darin auf. Was bedeutet es, ich weiß es nicht. Vielleicht multiplizieren sie einfach die Werte mit Koeffizienten, vielleicht etwas anderem.

Somit wird sum((forwardTo(X, n) - enchanced_net).^2) zu Null, wenn das Eingabebild in der Ebene n genau das erzeugt, was Sie wollen.

lambda ist der Regularisierungsparameter und R(X) ist, wie X natürlich aussieht. Ich habe es nicht implementiert und meine Ergebnisse sehen sehr laut aus. Was seine Formel betrifft, können Sie nach [2] suchen.

Ich habe Matlab und fminlbfgs zur Optimierung verwendet.

Der Schlüssel war, den Gradienten der obigen Formel zu finden, weil das Problem zu viele Dimensionen hat, um den Gradienten numerisch zu berechnen.

Wie gesagt, ich habe den Gradienten von R(X) nicht gefunden. Was den Hauptteil der Formel betrifft, habe ich es so gefunden:

  • Setzen Sie diff-Blob auf der Ebene n auf forwardTo(X, n) - enchanced_net . (Siehe coffe-Dokumentation für set_diff und set_data , set_data wird für forward verwendet und wartet auf Daten und set_diff wird für die Rückwärtsausbreitung verwendet und wartet auf Datenfehler.)
  • Führen Sie partielle Backpropagation vom Layer n-1 zur Eingabe aus.
  • Das Eingangs-diff-Blob würde den von uns benötigten Gradienten enthalten.

Python- und Matlab-Schnittstellen enthalten KEINE partielle Rückwärtsausbreitung, aber Caffe C ++ - Interna enthalten sie. Ich habe unten einen Patch hinzugefügt, um ihn in Matlab verfügbar zu machen.

Ergebnis der Verbesserung der vierten Ebene:

Ich bin nicht glücklich mit den Ergebnissen, aber ich denke, dass es etwas mit dem Artikel gemeinsam hat.

  • Hier ist der Code, der das Bild "wie es ist" erzeugt. Der Einstiegspunkt ist "run2.m", "fit2.m" enthält die Fitness-Funktion: Ссылка
  • Hier ist ein Caffe-Patch für die Matlab-Schnittstelle, um eine teilweise Backpropagation zur Verfügung zu stellen: Ссылка
Dmitry Galchinsky 24.06.2015, 14:07
quelle
3

In dem Link zum Ipython-Notebook, den Dmitry zur Verfügung gestellt hat, heißt es, dass es gradient Aufstieg mit Maximierung L2-Normalisierung macht. Ich glaube, das ist es, was Google bedeutet, das Feature aus einer algorithmischen Perspektive zu verbessern.

Wenn Sie darüber nachdenken, ist es wirklich so, dass das Minimieren von L2 eine Überanpassung verhindern würde, d. h. die Kurve würde glatter aussehen. Wenn Sie das Gegenteil tun, machen Sie das Feature offensichtlich.

Hier ist ein großartiger Link, um Gradientenaufstieg zu verstehen, obwohl er hauptsächlich von Gradientenabstieg spricht. p>

Ich weiß nicht viel über Implementierungsdetails in caffe, da ich meistens theano verwende. Hoffe es hilft!

Aktualisieren

So habe ich heute über die ausführlichen Artikel [1], [2], [3], [4] gelesen und finde heraus, dass [3] spricht tatsächlich über den Algorithmus in Details

  

Ein lokal optimales I kann durch die Rückausbreitung gefunden werden   Methode. Das Verfahren bezieht sich auf das ConvNet-Trainingsverfahren, bei dem die Rückwärtsausbreitung erfolgt   verwendet, um die Schichtgewichte zu optimieren. Der Unterschied ist, dass in unserem Fall die Optimierung durchgeführt wird   in Bezug auf das Eingabebild, während die Gewichte auf diejenigen festgelegt sind, die während der Trainingsstufe gefunden wurden.   Wir haben die Optimierung mit dem Nullbild initialisiert (in unserem Fall wurde das ConvNet auf der   Null-zentrierte Bilddaten) und fügte dann das Ergebnisbild des Trainingssatzes zu dem Ergebnis hinzu.

Daher trainierst du das Netzwerk nach der Einteilung erneut mit dem Eingangsbild, indem du den Gradientenanstieg verwendest, um eine höhere Punktzahl für die Klasse zu erhalten.

    
Kewei Qu 29.07.2015 18:34
quelle