tensorflow - learning - tensorboard graph
Comprender los histogramas de TensorBoard(peso) (1)
Parece que la red no ha aprendido nada en las capas uno a tres. La última capa cambia, lo que significa que puede haber algo mal con los gradientes (si los está manipulando manualmente), está restringiendo el aprendizaje a la última capa al optimizar solo sus pesos o la última capa realmente '' come ''todo error. También podría ser que solo se aprendan sesgos. Sin embargo, la red parece aprender algo, pero es posible que no esté utilizando todo su potencial. Se necesitaría más contexto aquí, pero vale la pena intentar jugar con la tasa de aprendizaje (por ejemplo, usar una más pequeña).
En general, los histogramas muestran el número de ocurrencias de un valor en relación con los valores de cada uno.
Simplemente hablando, si los valores posibles están en un rango de
0..9
y ve un pico de cantidad
10
en el valor
0
, esto significa que 10 entradas asumen el valor
0
;
en contraste, si el histograma muestra una meseta de
1
para todos los valores de
0..9
, significa que para 10 entradas, cada valor posible
0..9
ocurre
exactamente
una vez.
También puede usar histogramas para visualizar distribuciones de probabilidad cuando normaliza todos los valores de histograma por su suma total;
si hace eso, intuitivamente obtendrá la probabilidad de que aparezca un cierto valor (en el eje x) (en comparación con otras entradas).
Ahora para
layer1/weights
, la meseta significa que:
- la mayoría de los pesos están en el rango de -0.15 a 0.15
- es (en su mayoría) igualmente probable que un peso tenga alguno de estos valores, es decir, están (casi) uniformemente distribuidos
Dicho de otra manera, casi el mismo número de pesos tiene los valores
-0.15
,
0.0
,
0.15
y todo lo demás.
Hay algunos pesos que tienen valores ligeramente más pequeños o más altos.
En resumen, esto simplemente parece que los pesos se han inicializado utilizando una distribución uniforme con media cero y rango de valores
-0.15..0.15
... más o menos.
Si realmente utiliza una inicialización uniforme, esto es típico cuando la red aún no ha sido entrenada.
En comparación, las
layer1/activations
forman una forma de campana (gaussiana): los valores se centran alrededor de un valor específico, en este caso
0
, pero también pueden ser mayores o menores que eso (igualmente probable, ya que es simétrico) .
La mayoría de los valores aparecen cerca de la media de
0
, pero los valores varían de
-0.8
a
0.8
.
Supongo que la
layer1/activations
se toma como la distribución sobre todas las salidas de capa en un lote.
Puede ver que los valores cambian con el tiempo.
El histograma de la capa 4 no me dice nada específico.
Por la forma, solo muestra que algunos valores de peso alrededor de
-0.1
,
0.05
y
0.25
tienden a ocurrir con mayor probabilidad;
Una razón
podría
ser que las diferentes partes de cada neurona en realidad recogen la misma información y son básicamente redundantes.
Esto puede significar que podría usar una red más pequeña o que su red tiene el potencial de aprender características más distintivas para evitar el sobreajuste.
Sin embargo, estos son solo supuestos.
Además, como ya se indicó en los comentarios a continuación, agregue unidades de sesgo. Al dejarlos fuera, está restringiendo forzosamente su red a una solución posiblemente no válida.
Es realmente sencillo ver y comprender los valores escalares en TensorBoard. Sin embargo, no está claro cómo entender los gráficos de histograma.
Por ejemplo, son los histogramas de los pesos de mi red.
(Después de arreglar un error gracias al sol) ¿Cuál es la mejor manera de interpretar esto? Los pesos de la capa 1 se ven principalmente planos, ¿qué significa esto?
Agregué el código de construcción de red aquí.
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)