Tensorboard 权重直方图仅最后一层可见变化
Posted
技术标签:
【中文标题】Tensorboard 权重直方图仅最后一层可见变化【英文标题】:Tensorboard weights histogram only last layer visible change 【发布时间】:2017-12-16 23:22:58 【问题描述】:我向我的网络添加了一个 TensorBoard 可视化,并注意到只有异常值发生了很大变化。为什么网络的权重变化不大?这在叠加直方图中尤为明显。
直方图 相同但覆盖视图
我的模型
def neural_network_model(inputdata):
"""The blueprint of the network and the tensorboard information
:param inputdata: the placeholder for the inputdata
:returns: the output of the network?
"""
W1 = tf.get_variable("W1", shape=[set.input, nodes_h1],
initializer=tf.contrib.layers.xavier_initializer())
B1 = tf.get_variable("B1", shape=[nodes_h1],
initializer=tf.random_normal_initializer())
layer1 = tf.matmul(inputdata, W1)
layer1_bias = tf.add(layer1, B1)
layer1_act = tf.nn.relu(layer1)
W2 = tf.get_variable("W2", shape=[nodes_h1, nodes_h2],
initializer=tf.contrib.layers.xavier_initializer())
B2 = tf.get_variable("B2", shape=[nodes_h2],
initializer=tf.random_normal_initializer())
layer2 = tf.matmul(layer1_act, W2)
layer2_bias = tf.add(layer2, B2)
layer2_act = tf.nn.relu(layer2)
W3 = tf.get_variable("W3", shape=[nodes_h2, nodes_h3],
initializer=tf.contrib.layers.xavier_initializer())
B3 = tf.get_variable("B3", shape=[nodes_h3],
initializer=tf.random_normal_initializer())
layer3 = tf.matmul(layer2_act, W3)
layer3_bias = tf.add(layer3, B3)
layer3_act = tf.nn.relu(layer3)
WO = tf.get_variable("WO", shape=[nodes_h3, set.output],
initializer=tf.contrib.layers.xavier_initializer())
layerO = tf.matmul(layer3_act, WO)
with tf.name_scope('Layer1'):
tf.summary.histogram("weights", W1)
tf.summary.histogram("layer", layer1)
tf.summary.histogram("bias", layer1_bias)
tf.summary.histogram("activations", layer1_act)
with tf.name_scope('Layer2'):
tf.summary.histogram("weights", W2)
tf.summary.histogram("layer", layer2)
tf.summary.histogram("bias", layer2_bias)
tf.summary.histogram("activations", layer2_act)
with tf.name_scope('Layer3'):
tf.summary.histogram("weights", W3)
tf.summary.histogram("layer", layer3)
tf.summary.histogram("bias", layer3_bias)
tf.summary.histogram("activations", layer3_act)
with tf.name_scope('Output'):
tf.summary.histogram("weights", WO)
tf.summary.histogram("layer", layerO)
return layerO
我对训练过程的理解是应该调整权重,这在图像中几乎不会发生。然而,损失已经完成,我已经对网络进行了 10000 个 epoch 的训练,所以我预计总体上会有更多的变化。尤其是我不明白的权重没有变化。
【问题讨论】:
我的神经网络也有类似的问题,我发现大部分损失都被偏差消耗了。你有没有偶然得出任何结论? 【参考方案1】:我的神经网络中的权重直方图也遇到过类似问题。尽管 Relu 确实处理了隐藏层的梯度消失问题,但您应该检查您的学习率并确保每个变量的更新不会太小。这可能会导致接近于零的更新,从而导致随着时间的推移发生微不足道的变化。您可以使用以下 sn-p 简单地检查每一层的渐变:
def replace_none_with_zero(tensor):
return[0 if i==None else i for i in tensor]
with tf.name_scope('Gradients'):
gradient_for_variable_of_interest=replace_none_with_zero(
tf.gradients(loss,[variable_of_interest]))
然后通过调用梯度上的 tf.summary.histogram 在 tensorboard 中检查你的梯度。
【讨论】:
以上是关于Tensorboard 权重直方图仅最后一层可见变化的主要内容,如果未能解决你的问题,请参考以下文章
Conv1D 不更新权重。 (全为零)和测试输出总是相同的,等于最后一层权重?
使用 Keras 和 fit_generator 的 TensorBoard 分布和直方图