2017-12-28 13 views
10

Ich bin immer noch Neuling in tensorflow und ich versuche zu verstehen, was in Details passiert, während das Training meiner Modelle weitergeht. Kurz gesagt, ich verwende die slim Modelle, die auf ImageNet vortrainiert sind, um die finetuning auf meinem Dataset zu tun. Hier sind einige Parzellen von tensorboard für 2 separate Modelle extrahieren:Interpretieren Tensorboard Plots

Model_1 (InceptionResnet_V2) 

Inception resnet V2

Model_2 (InceptionV4) 

InceptionV4

Bisher beiden Modelle schlechte Ergebnisse auf den Validierungssätzen (Durchschnittliches Az (Fläche unter die ROC-Kurve) = 0,7 für Model_1 & 0,79 für Model_2). Meine Interpretation zu diesen Plots ist, dass sich die Gewichte nicht über die Mini-Chargen ändern. Es sind nur die Vorurteile, die sich über die Mini-Chargen ändern, und dies könnte das Problem sein. Aber ich weiß nicht, wo ich nachsehen soll, um diesen Punkt zu überprüfen. Dies ist die einzige Interpretation, die ich mir vorstellen kann, aber es könnte falsch sein, wenn man bedenkt, dass ich immer noch Neuling bin. Kannst du mir bitte deine Gedanken mitteilen? Zögern Sie nicht, im Notfall weitere Parzellen anzufordern.

EDIT: Wie Sie in den folgenden Darstellungen sehen können, scheint es, dass die Gewichte sich im Laufe der Zeit kaum ändern. Dies gilt für alle anderen Gewichtungen für beide Netzwerke. Dies führte mich zu der Annahme, dass es irgendwo ein Problem gibt, aber ich weiß nicht, wie ich es interpretieren soll.

InceptionV4 weights 

InceptionV4 weights

InceptionResnetV2 weights 

InceptionResnetV2 weights

EDIT2: Diese Modelle zunächst auf IMAGEnet ausgebildet wurden und diese Diagramme sind die Ergebnisse von ihnen auf meinem Dataset Feinstimm. Ich verwende einen Datensatz von 19 Klassen mit ungefähr 800000 Bildern darin. Ich mache ein Multi-Label-Klassifikationsproblem und verwende sigmoid_crossentropy als Verlustfunktion. Die Klassen sind sehr unausgewogen.In der nachstehenden Tabelle sind zeigen wir den Prozentsatz der Anwesenheit von jeder Klasse in den zwei Untergruppen (Zug, Validierung):

Objects  train  validation 
obj_1  3.9832 % 0.0000 % 
obj_2  70.6678 % 33.3253 % 
obj_3  89.9084 % 98.5371 % 
obj_4  85.6781 % 81.4631 % 
obj_5  92.7638 % 71.4327 % 
obj_6  99.9690 % 100.0000 % 
obj_7  90.5899 % 96.1605 % 
obj_8  77.1223 % 91.8368 % 
obj_9  94.6200 % 98.8323 % 
obj_10  88.2051 % 95.0989 % 
obj_11  3.8838 % 9.3670 % 
obj_12  50.0131 % 24.8709 % 
obj_13  0.0056 % 0.0000 % 
obj_14  0.3237 % 0.0000 % 
obj_15  61.3438 % 94.1573 % 
obj_16  93.8729 % 98.1648 % 
obj_17  93.8731 % 97.5094 % 
obj_18  59.2404 % 70.1059 % 
obj_19  8.5414 % 26.8762 % 

Die Werte des hyperparams:

batch_size=32 
weight_decay = 0.00004 #'The weight decay on the model weights.' 
optimizer = rmsprop 
rmsprop_momentum = 0.9 
rmsprop_decay = 0.9 #'Decay term for RMSProp.' 

learning_rate_decay_type = exponential #Specifies how the learning rate is decayed 
learning_rate = 0.01 #Initial learning rate. 
learning_rate_decay_factor = 0.94 #Learning rate decay factor 
num_epochs_per_decay = 2.0 #'Number of epochs after which learning rate 

In Bezug auf die sparsity von die Schichten, sind hier einige Proben der sparsity der Schichten für beide Netze:

sparsity (InceptionResnet_V2) 

enter image description here

sparsity (InceptionV4) 

enter image description here

EDITED3: Hier sind die Plots der Verluste für beide Modelle:

Losses and regularization loss (InceptionResnet_V2) 

enter image description here

Losses and regularization loss (InceptionV4) 

enter image description here

+0

Ich bin nicht vertraut mit RMSprop, aber diese Hyperparameter sehen gut aus für mich. Sie haben auch eine beträchtliche Menge an Daten ... Ich weiß, auROC ist eine gute Metrik für voreingenommene Klassifizierung, aber aus Neugier haben Sie Top-1 oder - vorzugsweise - ** Top-5 Genauigkeit **? Wie wäre es mit einer Darstellung des tatsächlichen ** Verlustwertes **? –

+0

In meinem Fall ist es eine Multi-Label-Klassifizierung, so dass es keine Möglichkeit gibt, über das Problem als Top-1 oder Top-5 nachzudenken, weil ein Bild 19 verschiedene Klassen hat (nicht nur eine Hauptklasse in der Multi-Klasse) Einstufung). Ich habe die Verluste Plots hinzugefügt – Maystro

+0

Mein Fehler, ich habe das Problem falsch verstanden. Danke für die Verlustplots. –

Antwort

5

ich mit einigen beurteilen - Die Gewichte ändern sich über die Minibatches nicht sehr stark. Es scheint, dass sie sich ändern etwas.

Wie Sie sicher wissen, führen Sie Feineinstellungen mit sehr großen Modellen durch. Daher kann Backprop manchmal eine Weile dauern. Aber Sie führen viele Trainings-Iterationen durch. Ich glaube nicht, dass das das Problem ist.

Wenn ich mich nicht irre, wurden beide ursprünglich auf ImageNet trainiert. Wenn sich Ihre Bilder in einer völlig anderen Domäne als in ImageNet befinden, könnte das das Problem erklären.

Die backprop equations machen es einfacher, Änderungen mit bestimmten Aktivierungsbereichen zu ändern. ReLU kann eins sein, wenn das Modell sehr spärlich ist (d. H. Wenn viele Schichten Aktivierungswerte von 0 haben, dann werden Gewichtungen schwer zu justieren sein, aber Verzerrungen nicht). Wenn Aktivierungen im Bereich [0, 1] liegen, ist der Gradient in Bezug auf ein Gewicht höher als der Gradient in Bezug auf eine Vorspannung. (Deshalb ist Sigmoid eine schlechte Aktivierungsfunktion).

Es könnte auch auf Ihre Ausleseschicht bezogen werden - insbesondere die Aktivierungsfunktion. Wie berechnen Sie Fehler? Ist das ein Klassifikations- oder Regressionsproblem? Wenn es möglich ist, empfehle ich, etwas anderes als Sigmoid als Ihre letzte Aktivierungsfunktion zu verwenden. tanh könnte marginal besser sein. Das lineare Auslesen beschleunigt manchmal auch das Training (alle Gradienten müssen die Ausleseschicht "durchlaufen". Wenn die Ableitung der Ausleseschicht immer 1 - linear ist - "lasst mehr Gradient durch", um die Gewichte weiter nach unten anzupassen das Model).

Schließlich merke ich, dass Ihre Gewichte Histogramme auf negative Gewichte schieben. Manchmal, besonders bei Modellen, die viel ReLU-Aktivierung haben, kann dies ein Indikator für die Lernschwierigkeiten des Modells sein. Oder ein Hinweis auf das tote Neuronenproblem. Oder beides - die beiden sind etwas miteinander verbunden.

Letztendlich denke ich, dass Ihr Modell nur mühsam zu lernen ist. Ich habe sehr ähnliche Histogramme erlebt, die Inception neu trainierten. Ich benutzte einen Datensatz von ungefähr 2000 Bildern und ich kämpfte darum, sie über 80% Genauigkeit zu pushen (da der Datensatz stark verzerrt war - die Genauigkeit war ungefähr so ​​gut wie das zufällige Raten).Es half, wenn ich die Faltungsvariablen konstant machte und nur Änderungen an der vollständig verbundenen Schicht vornahm.


In der Tat ist dies ein Klassifizierungsproblem und sigmoid cross Entropie ist die geeignete Aktivierungsfunktion. Und Sie haben einen beträchtlichen Datensatz - sicherlich groß genug, um diese Modelle fein abzustimmen.

Mit dieser neuen Information, würde ich empfehlen, die anfängliche Lernrate zu senken. Ich habe hier eine zweifache Begründung:

(1) ist meine eigene Erfahrung. Wie ich bereits erwähnt habe, bin ich mit RMSprop nicht besonders vertraut. Ich habe es nur im Zusammenhang mit DNCs verwendet (obwohl DNCs mit Convolutional Controllern), aber meine Erfahrung dort unterstützt das, was ich gerade sagen werde. Ich denke .01 ist hoch für das Training eines Modells von Grund auf, geschweige denn Feinabstimmung. Es ist definitiv hoch für Adam. In gewissem Sinne ist das Beginnen mit einer kleinen Lernrate der "feine" Teil der Feinabstimmung. Zwingt die Gewichte nicht so sehr, sich zu verschieben. Vor allem, wenn Sie das gesamte Modell anpassen und nicht die letzten (wenigen) Ebenen.

(2) ist die zunehmende Sparsity und Verschiebung in Richtung negativer Gewichte. Basierend auf Ihren Sparsity Plots (gute Idee BTW), sieht es für mich aus wie einige Gewichte in einer spärlichen Konfiguration als Ergebnis der Überkorrektur stecken bleiben könnte. Das heißt, aufgrund einer hohen Anfangsgeschwindigkeit "überschwingen" die Gewichte ihre optimale Position und bleiben irgendwo stecken, was es für sie schwierig macht, sich zu erholen und zum Modell beizutragen. Das heißt, in einem ReLU-Netzwerk ist eine leicht negative und nahe Null nicht gut.

Wie ich (wiederholt) erwähnt habe, kenne ich RMSprop nicht sehr gut. Aber, da Sie bereits viele Trainings-Iterationen laufen lassen, geben Sie niedrige, niedrige niedrige Anfangsraten einen Schuss und arbeiten Sie sich nach oben. Ich meine, sehen Sie, wie 1e-8 funktioniert. Es ist möglich, dass das Modell nicht auf eine so niedrige Rate reagiert, sondern eine informelle Hyperparametersuche mit der Lernrate durchführt. Nach meiner Erfahrung mit Inception mit Adam, 1e-4 bis 1e-8 hat gut funktioniert.

+0

Danke für deinen Kommentar, ich habe meine Frage bearbeitet. – Maystro

+0

@Maystro Bearbeiten Sie basierend auf Ihren Änderungen. Hoffe das hilft. –

+0

Dank @Dylan F. Ich habe ein anderes Training mit einer Lernrate von 1e-4 gestartet und starte ein weiteres mit adam optimizer mit der von Ihnen vorgeschlagenen Lernrate. Ich melde mich bei Ihnen, sobald ich Ergebnisse habe. – Maystro