88 votes

Comprendre les histogrammes TensorBoard (poids)

Il est vraiment simple à voir et à comprendre les valeurs scalaires dans TensorBoard. Cependant, il n'est pas clair comment comprendre l'histogramme des graphiques.

Par exemple, ils sont les histogrammes de mon réseau poids.

enter image description here

(Après la correction d'un bug grâce à sunside) enter image description here Quelle est la meilleure façon de les interpréter? La couche 1 poids regardent la plupart du temps à plat, qu'est-ce que cela signifie?

J'ai ajouté de la construction du réseau de code ici.

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)

107voto

Markus Points 933

Il semble que le réseau n'a pas appris quoi que ce soit dans les couches une à trois. La dernière couche ne change pas, ce qui signifie qu'il n'y a peut être quelque chose de mal avec l'gradients (si vous êtes à la falsification manuellement), vous êtes contraignant de l'apprentissage à la dernière couche en optimisant uniquement de son poids ou de la dernière couche vraiment 'mange' erreur. Il se pourrait aussi que seuls les préjugés sont appris. Le réseau apparaît à apprendre quelque chose de bien, mais il ne pourrait pas utiliser son plein potentiel. Plus de contexte serait nécessaire ici, mais à jouer avec le taux d'apprentissage (par exemple, en utilisant une plus petite) peut être vaut la peine d'essayer.

En général, les histogrammes d'afficher le nombre d'occurrences d'une valeur par rapport aux autres valeurs. Pour parler simplement, si les valeurs possibles sont dans une gamme de 0..9 et vous voyez un pic de montant 10 sur la valeur 0, cela signifie que 10 entrées assumer la valeur 0; en revanche, si l'histogramme montre un plateau d' 1 pour toutes les valeurs de 0..9il signifie que pour 10 entrées, chaque valeur possible 0..9 se produit exactementune fois. Vous pouvez également utiliser les histogrammes de visualiser les distributions de probabilité lorsque vous normaliser tous histogramme des valeurs par leur somme totale; si vous le faites, vous allez intuitivement obtenir la probabilité avec laquelle une certaine valeur (sur l'axe des x) apparaît (par rapport à d'autres intrants).

Maintenant, pour layer1/weights, le plateau signifie que:

  • la plupart des poids sont dans la gamme de -0.15 à 0,15
  • il est (presque) la même probabilité pour un poids pour avoir une de ces valeurs, c'est à dire qu'ils sont (presque) uniformément répartie

Autrement dit, presque le même nombre de poids ont les valeurs -0.15, 0.0, 0.15 et tout entre les deux. Il y a un peu de poids après avoir légèrement plus petite ou la plus élevée des valeurs. Donc, en bref, cela ressemble simplement les poids ont été initialisée en utilisant une distribution uniforme de moyenne nulle et de chaîne de valeur de -0.15..0.15 ... donner ou prendre. Si vous le faites, en effet, utiliser l'initialisation uniforme, alors c'est typique lorsque le réseau n'a pas été formés encore.

En comparaison, layer1/activations forme une courbe en cloche (gaussien)-forme: Les valeurs sont centrées autour d'une valeur spécifique, dans ce cas - 0, mais ils peuvent également être plus grande ou plus petite que celle (tout aussi vraisemblable, puisque c'est symétrique). La plupart des valeurs semblent proches autour de la moyenne de 0, mais les valeurs ne vont de -0.8 de 0.8. Je suppose que l' layer1/activations est considéré comme la distribution sur toute la couche de sorties dans un lot. Vous pouvez voir que les valeurs changent avec le temps.

La couche 4 de l'histogramme ne me dit rien de précis. À partir de la forme, c'est juste à démontrer que certaines des valeurs de poids autour de -0.1, 0.05 et 0.25 ont tendance à se produire avec une probabilité plus élevée; une raison pourrait être que les différentes parties de chaque neurone en fait, il y ramasser les mêmes informations et sont fondamentalement inutile. Cela peut signifier que vous pouvez réellement utiliser un petit réseau ou que votre réseau a le potentiel pour en savoir plus caractéristiques distinctives afin d'éviter le surajustement. Ce sont juste des hypothèses.

Aussi, comme déjà dit dans les commentaires ci-dessous, faites ajouter biais d'unités. En les mettant, vous êtes force contraignante de votre réseau pour une éventuelle solution non valide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: