Es ist wirklich einfach, die Skalarwerte in TensorBoard zu sehen und zu verstehen. Es ist jedoch nicht klar, wie Histogrammdiagramme zu verstehen sind.
Zum Beispiel sind sie die Histogramme meiner Netzwerkgewichte.
(Nachdem ein Fehler dank Sunside behoben wurde) Wie lassen sich diese am besten interpretieren? Schicht 1 Gewichte sehen meistens flach aus. Was bedeutet das?
Ich habe hier den Netzwerkaufbaucode hinzugefügt.
X = tf.placeholder(tf.float32, [None, input_size], name="input_x")
x_image = tf.reshape(X, [-1, 6, 10, 1])
tf.summary.image('input', x_image, 4)
# First layer of weights
with tf.name_scope("layer1"):
W1 = tf.get_variable("W1", shape=[input_size, hidden_layer_neurons],
initializer=tf.contrib.layers.xavier_initializer())
layer1 = tf.matmul(X, W1)
layer1_act = tf.nn.tanh(layer1)
tf.summary.histogram("weights", W1)
tf.summary.histogram("layer", layer1)
tf.summary.histogram("activations", layer1_act)
# Second layer of weights
with tf.name_scope("layer2"):
W2 = tf.get_variable("W2", shape=[hidden_layer_neurons, hidden_layer_neurons],
initializer=tf.contrib.layers.xavier_initializer())
layer2 = tf.matmul(layer1_act, W2)
layer2_act = tf.nn.tanh(layer2)
tf.summary.histogram("weights", W2)
tf.summary.histogram("layer", layer2)
tf.summary.histogram("activations", layer2_act)
# Third layer of weights
with tf.name_scope("layer3"):
W3 = tf.get_variable("W3", shape=[hidden_layer_neurons, hidden_layer_neurons],
initializer=tf.contrib.layers.xavier_initializer())
layer3 = tf.matmul(layer2_act, W3)
layer3_act = tf.nn.tanh(layer3)
tf.summary.histogram("weights", W3)
tf.summary.histogram("layer", layer3)
tf.summary.histogram("activations", layer3_act)
# Fourth layer of weights
with tf.name_scope("layer4"):
W4 = tf.get_variable("W4", shape=[hidden_layer_neurons, output_size],
initializer=tf.contrib.layers.xavier_initializer())
Qpred = tf.nn.softmax(tf.matmul(layer3_act, W4)) # Bug fixed: Qpred = tf.nn.softmax(tf.matmul(layer3, W4))
tf.summary.histogram("weights", W4)
tf.summary.histogram("Qpred", Qpred)
# We need to define the parts of the network needed for learning a policy
Y = tf.placeholder(tf.float32, [None, output_size], name="input_y")
advantages = tf.placeholder(tf.float32, name="reward_signal")
# Loss function
# Sum (Ai*logp(yi|xi))
log_lik = -Y * tf.log(Qpred)
loss = tf.reduce_mean(tf.reduce_sum(log_lik * advantages, axis=1))
tf.summary.scalar("Q", tf.reduce_mean(Qpred))
tf.summary.scalar("Y", tf.reduce_mean(Y))
tf.summary.scalar("log_likelihood", tf.reduce_mean(log_lik))
tf.summary.scalar("loss", loss)
# Learning
train = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(loss)
tensorflow
histogram
tensorboard
Kim gesungen
quelle
quelle
tf.nn.softmax(tf.matmul(layer3_act, W4))
.B1 = tf.get_variable("B1", shape=[hidden_layer_neurons],initializer=tf.random_normal_initializer())
undlayer1_bias = tf.add(layer1, B1)
undtf.summary.histogram("bias", layer1_bias)
input_size
damit wir ihn ausführen und das Ergebnis in sehen könnentensorboard
Antworten:
Es scheint, dass das Netzwerk in den Schichten eins bis drei nichts gelernt hat. Die letzte Ebene ändert sich, was bedeutet, dass entweder etwas mit den Verläufen nicht stimmt (wenn Sie sie manuell manipulieren). Sie beschränken das Lernen auf die letzte Ebene, indem Sie nur deren Gewichte oder die letzte Ebene wirklich optimieren. ' frisst 'alle Fehler auf. Es könnte auch sein, dass nur Vorurteile gelernt werden. Das Netzwerk scheint zwar etwas zu lernen, nutzt aber möglicherweise nicht sein volles Potenzial aus. Hier wäre mehr Kontext erforderlich, aber das Herumspielen mit der Lernrate (z. B. mit einer kleineren) könnte einen Versuch wert sein.
Im Allgemeinen zeigen Histogramme die Anzahl der Vorkommen eines Werts relativ zueinander an. Einfach ausgedrückt, wenn die möglichen Werte in einem Bereich von liegen
0..9
und Sie einen Anstieg des Betrags10
auf dem Wert sehen0
, bedeutet dies, dass 10 Eingaben den Wert annehmen0
; Wenn das Histogramm dagegen ein Plateau von1
für alle Werte von zeigt0..9
, bedeutet dies, dass für 10 Eingaben jeder mögliche Wert genau einmal0..9
auftritt . Sie können auch Histogramme verwenden, um Wahrscheinlichkeitsverteilungen zu visualisieren, wenn Sie alle Histogrammwerte durch ihre Gesamtsumme normalisieren. Wenn Sie dies tun, erhalten Sie intuitiv die Wahrscheinlichkeit, mit der ein bestimmter Wert (auf der x-Achse) angezeigt wird (im Vergleich zu anderen Eingaben).Jetzt für
layer1/weights
das Plateau bedeutet , dass:Anders gesagt, fast die gleiche Anzahl von Gewichten hat die Werte
-0.15
,0.0
,0.15
und alles dazwischen. Es gibt einige Gewichte mit etwas kleineren oder höheren Werten. Kurz gesagt, dies sieht einfach so aus, als ob die Gewichte mit einer gleichmäßigen Verteilung mit einem Mittelwert von Null und einem Wertebereich initialisiert wurden-0.15..0.15
... Geben oder Nehmen. Wenn Sie tatsächlich eine einheitliche Initialisierung verwenden, ist dies typisch, wenn das Netzwerk noch nicht trainiert wurde.Im Vergleich dazu
layer1/activations
bildet sich eine Glockenkurvenform (Gauß): Die Werte sind in diesem Fall um einen bestimmten Wert zentriert0
, können aber auch größer oder kleiner sein (ebenso wahrscheinlich, da sie symmetrisch sind). Die meisten Werte erscheinen nahe am Mittelwert von0
, aber die Werte reichen von-0.8
bis0.8
. Ich gehe davon aus, dass daslayer1/activations
als Verteilung über alle Layer-Ausgaben in einem Batch genommen wird. Sie können sehen, dass sich die Werte im Laufe der Zeit ändern.Das Layer 4-Histogramm sagt mir nichts Bestimmtes. Aus der Form geht nur hervor, dass einige Gewichtswerte vorhanden
-0.1
sind0.05
und0.25
tendenziell mit einer höheren Wahrscheinlichkeit auftreten. Ein Grund könnte sein, dass verschiedene Teile jedes Neurons dort tatsächlich die gleichen Informationen aufnehmen und grundsätzlich redundant sind. Dies kann bedeuten, dass Sie tatsächlich ein kleineres Netzwerk verwenden könnten oder dass Ihr Netzwerk das Potenzial hat, mehr Unterscheidungsmerkmale zu erlernen, um eine Überanpassung zu verhindern. Dies sind jedoch nur Annahmen.Fügen Sie außerdem, wie bereits in den Kommentaren unten angegeben, Bias-Einheiten hinzu. Wenn Sie sie weglassen, beschränken Sie Ihr Netzwerk zwangsweise auf eine möglicherweise ungültige Lösung.
quelle
layer4/Qpred
sieht es so aus, als könnte es viel besser werden. Was die Gewichte angeht, die gleich bleiben ... Ich finde das faul, aber ich kann es momentan nicht verstehen. Könnte sein, dass es wirklich die richtige Verteilung ist, aber da sich überhaupt nichts ändert, fällt es mir schwer zu glauben.