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 .
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.
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.
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.
Tags und Links image tensorflow deep-learning numpy conv-neural-network