热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

了解TensorBoard(重量)直方图

如何解决《了解TensorBoard(重量)直方图》经验,为你挑选了1个好方法。

查看和理解TensorBoard中的标量值非常简单.但是,目前还不清楚如何理解直方图.

例如,它们是我的网络权重的直方图.

在此输入图像描述

(由于sunside修复了一个bug) 在此输入图像描述 解释这些的最佳方法是什么?第1层重量看起来大致平坦,这意味着什么?

我在这里添加了网络构造代码.

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)

sunside.. 114

似乎网络没有在第一层到第三层中学到任何东西.最后一层确实发生了变化,这意味着渐变可能有问题(如果你手动篡改它们),你只是通过优化其权重或最后一层来限制学习到最后一层.吃掉'所有的错误.也可能只是学习了偏见.虽然网络似乎学到了一些东西,但它可能没有充分利用它的潜力.这里需要更多的背景,但是学习率(例如使用较小的学习率)可能值得一试.

通常,直方图显示值相对于彼此值的出现次数.简单地说,如果可能的值是在一个范围内的0..9,你看到量的穗10上的值0时,这意味着10个输入采取值0; 相反,如果直方图显示1所有值的平台0..9,则意味着对于10个输入,每个可能的值恰好0..9出现一次.当您将所有直方图值按其总和标准化时,您还可以使用直方图来显示概率分布; 如果你这样做,你将直观地获得某个值(在x轴上)出现的可能性(与其他输入相比).

现在layer1/weights,高原意味着:

大多数重量在-0.15到0.15的范围内

它(大多数)同样可能使重量具有任何这些值,即它们(几乎)均匀分布

换种说法,几乎相同数量的权重有值-0.15,0.0,0.15以及两者之间的一切.有一些权重略微更小或更高.简而言之,这看起来就像权重已经使用均值分布初始化,均值和值范围为零-0.15..0.15......给定或采用.如果您确实使用统一初始化,那么当网络尚未经过培训时,这是典型的.

相比之下,layer1/activations形成钟形曲线(高斯)形状:在这种情况下0,值以特定值为中心,但它们也可能大于或小于(同样可能如此,因为它是对称的).最值出现周围的平均值接近0,但是从数值范围做-0.80.8.我假设它layer1/activations被视为批量中所有图层输出的分布.您可以看到值随时间变化.

第4层直方图没有告诉我任何具体的内容.从形状来看,它只是显示出一些重量值-0.1,0.05并且0.25倾向于以更高的概率发生; 一个原因可能是,每个神经元的不同部分实际上拾取相同的信息并且基本上是多余的.这可能意味着您实际上可以使用较小的网络,或者您的网络有可能学习更多区别特征以防止过度拟合.这些只是假设.

此外,如下面的评论中所述,请添加偏差单位.通过将它们排除在外,您可以将网络强制约束为可能无效的解决方案.



1> sunside..:

似乎网络没有在第一层到第三层中学到任何东西.最后一层确实发生了变化,这意味着渐变可能有问题(如果你手动篡改它们),你只是通过优化其权重或最后一层来限制学习到最后一层.吃掉'所有的错误.也可能只是学习了偏见.虽然网络似乎学到了一些东西,但它可能没有充分利用它的潜力.这里需要更多的背景,但是学习率(例如使用较小的学习率)可能值得一试.

通常,直方图显示值相对于彼此值的出现次数.简单地说,如果可能的值是在一个范围内的0..9,你看到量的穗10上的值0时,这意味着10个输入采取值0; 相反,如果直方图显示1所有值的平台0..9,则意味着对于10个输入,每个可能的值恰好0..9出现一次.当您将所有直方图值按其总和标准化时,您还可以使用直方图来显示概率分布; 如果你这样做,你将直观地获得某个值(在x轴上)出现的可能性(与其他输入相比).

现在layer1/weights,高原意味着:

大多数重量在-0.15到0.15的范围内

它(大多数)同样可能使重量具有任何这些值,即它们(几乎)均匀分布

换种说法,几乎相同数量的权重有值-0.15,0.0,0.15以及两者之间的一切.有一些权重略微更小或更高.简而言之,这看起来就像权重已经使用均值分布初始化,均值和值范围为零-0.15..0.15......给定或采用.如果您确实使用统一初始化,那么当网络尚未经过培训时,这是典型的.

相比之下,layer1/activations形成钟形曲线(高斯)形状:在这种情况下0,值以特定值为中心,但它们也可能大于或小于(同样可能如此,因为它是对称的).最值出现周围的平均值接近0,但是从数值范围做-0.80.8.我假设它layer1/activations被视为批量中所有图层输出的分布.您可以看到值随时间变化.

第4层直方图没有告诉我任何具体的内容.从形状来看,它只是显示出一些重量值-0.1,0.05并且0.25倾向于以更高的概率发生; 一个原因可能是,每个神经元的不同部分实际上拾取相同的信息并且基本上是多余的.这可能意味着您实际上可以使用较小的网络,或者您的网络有可能学习更多区别特征以防止过度拟合.这些只是假设.

此外,如下面的评论中所述,请添加偏差单位.通过将它们排除在外,您可以将网络强制约束为可能无效的解决方案.


没有任何偏见可能是一个非常糟糕的想法 - 它就像试图通过(高维度)点云绘制线,但被迫通过值0; 它可能会工作,并会给你_some_解决方案,但可能是一个坏的或完全错误的.
推荐阅读
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 开源Keras Faster RCNN模型介绍及代码结构解析
    本文介绍了开源Keras Faster RCNN模型的环境需求和代码结构,包括FasterRCNN源码解析、RPN与classifier定义、data_generators.py文件的功能以及损失计算。同时提供了该模型的开源地址和安装所需的库。 ... [详细]
  • 代码如下:#coding:utf-8importstring,os,sysimportnumpyasnpimportmatplotlib.py ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
author-avatar
张伊韵育财育信
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有