Wie berechnet man den Farbverlauf eines Bildes basierend auf einer bestimmten Klasse?

8

Im Brechen linearer Klassifikatoren auf ImageNet schlägt der Autor die folgende Methode zum Erstellen vor kontradiktorische Bilder, die ConvNets täuschen:

  

Kurz gesagt, um ein dummes Bild zu erstellen, beginnen wir mit dem Bild, das wir haben   wollen (ein tatsächliches Bild oder sogar ein Rauschmuster), und dann verwenden   Backpropagation, um den Gradienten der Bildpixel auf jedem zu berechnen   Klassenwertung und schubst sie mit. Wir können, müssen aber nicht wiederholen   der Prozess ein paar Mal. Sie können Backpropagation darin interpretieren   Einstellung wie mit dynamischer Programmierung, um die schädlichsten zu berechnen   lokale Störung des Eingangs. Beachten Sie, dass dieser Prozess sehr ist   effizient und benötigt nur wenig Zeit, wenn Sie Zugriff auf die   Parameter des ConvNet (Backprop ist schnell), aber es ist möglich zu tun   Dies gilt auch dann, wenn Sie nicht auf die Parameter zugreifen können, sondern nur auf die   Klassenwerte am Ende. In diesem Fall ist es möglich, das zu berechnen   Datengradienten numerisch oder um andere lokale stochastische Suche zu verwenden   Strategien usw. Beachten Sie, dass aufgrund des letzteren Ansatzes sogar   nicht differenzierbare Klassifizierer (z. B. Random Forests) sind nicht sicher (aber   Ich habe noch niemanden gesehen, der dies empirisch bestätigt).

Ich weiß, dass ich den Gradient eines Bildes so berechnen kann:

%Vor%

Aber wie berechne ich den Gradient eines Bildes relativ zu einer anderen Bildklasse mit TensorFlow oder Numpy? Wahrscheinlich muss ich etwas Ähnliches tun wie in diesem Tutorial . Wie:

%Vor%

Aber ich bin mir nicht sicher, wie genau ... Genauer gesagt habe ich ein Bild von Ziffer 2 wie folgt:

%Vor%

Wie berechne ich den Gradient dieses Bildes relativ zur Bildklasse der Ziffer 6 (mit einem Beispiel unten)? (Ich denke, ich muss den Gradient für alle digit 6 Bilder mit Backpropagation berechnen.)

%Vor%

Vielen Dank im Voraus für jede Hilfe!

Hier sind zwei verwandte Fragen, die ich gestellt habe:

Wie zu verwenden Bild und Gewicht-Matrix, um kontradiktorische Bilder in TensorFlow zu erstellen?

Erstellen von kontradiktorischen Bildern für ConvNet?

>

Und hier ist mein Skript .

    
George Liu 24.12.2016, 02:35
quelle

1 Antwort

1

Nur Klassenergebnisse

Wenn Sie nur Zugriff auf die Klassenwerte für jedes Bild haben, das Sie vorschlagen, gibt es nicht viel Phantasie, die Sie tun können, um einen Farbverlauf wirklich zu berechnen.

Wenn das, was zurückgegeben wird, als relative Punktzahl für jede Kategorie angesehen werden kann, ist es ein Vektor v , der das Ergebnis einer Funktion f ist, die auf einen Vektor A wirkt, der alle Informationen auf dem Bild enthält * . Der wahre Gradient der Funktion ist gegeben durch die Matrix D(A) , die von A abhängt, so dass D(A)*B = (f(A + epsilon*B) -f(A))/epsilon in der Grenze kleiner epsilon für jede B . Sie könnte dies numerisch mit einem kleinen Wert für epsilon und eine Anzahl von Testmatrizen B approximieren (eine für jedes Element von A sollte ausreichen), aber das ist wahrscheinlich unnötig teuer.

Was Sie versuchen, ist die Maximierung der Schwierigkeit, die der Algorithmus beim Erkennen des Bildes hat. Das heißt, für einen bestimmten Algorithmus f möchten Sie ein angemessenes Maß dafür erzielen, wie schlecht der Algorithmus jedes Ihrer Bilder A erkennt. Es gibt eine Fülle von Methoden dafür. Ich kenne sie nicht sehr gut, aber ein Vortrag, den ich kürzlich gesehen habe, enthielt einige interessante Informationen dazu ( Ссылка , siehe Seite 24 und höher). Die Berechnung des gesamten Gradienten ist normalerweise viel zu teuer, wenn Sie einen hohen dimensionalen Input haben. Statt dessen modifizierst du einfach eine zufällig ausgewählte Koordinate und nimmst viele (viele) kleine, billige Schritte mehr oder weniger in die richtige Richtung, anstatt für irgendwie optimale große, aber teure Schritte zu gehen.

Modell verfügbar und geeignet

Wenn Sie das Modell vollständig kennen und es möglich ist, explizit als v = f(A) zu schreiben, können Sie den Gradienten der Funktion f berechnen. Dies wäre der Fall, wenn der Algorithmus, den Sie zu schlagen versuchen, eine lineare Regression ist, möglicherweise mit mehreren Ebenen. Die Form des Gradienten sollte leichter für Sie sein, als für mich, um es hier niederzuschreiben.

Wenn dieser Gradient verfügbar und ziemlich billig ist, um seinen Wert für verschiedene Bilder A auszuwerten, können Sie beispielsweise mit einem steilsten Abstieg (oder Aufstieg) fortfahren, um das Bild für den Algorithmus weniger erkennbar zu machen.

Wichtiger Hinweis

Es ist wahrscheinlich am besten, nicht zu vergessen, dass Ihr Ansatz das Bild auch für den Menschen nicht unlesbar machen sollte, was alles ziemlich sinnlos machen würde.

  • Ich denke, zum Zweck dieser Diskussion ist es am besten, das Bild als Vektor zu sehen
KeithWM 10.01.2017 13:43
quelle