- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我基本上是在玩复制 AlphaZero。它适用于一些小型游戏,但我正在尝试将其扩展到更复杂的游戏。然而,现在我的网络经过 2-1000 万次移动训练后将充满 NaN。不幸的是,由于它的不确定性以及故障点发生的范围如此之广,使用调试器的效果并不理想。当我让 tfdbg 检查“has_inf_or_nan”时,训练 12000 个 Action 大约需要 5 分钟。所以调试器没有为我做任何事情,因为需要很长时间才能出现错误。
在这篇文章的最底部,我将描述该模型的外观。
以下是我如何使用 NaN 常见来源的某些内容:
损失函数(具有 2 个输出的单个网络:策略(选择一步的几率)和值(value)(活跃玩家的棋盘位置的质量):
注意:move_result_placeholder 填充了一批作为蒙特卡洛树搜索输出的移动。由于大多数移动位置都是无效的,因此通常充满 0 和 5-10,这些 float 表示选择该移动的几率。我有一个断言来验证它们的总和为 1。在运行训练时,我也有一个断言来验证所有输入都不为 NaN。在填充批处理时,我从最后 1,000,000 个(棋盘状态、移动、奖励)的集合中统一随机选择。然后我将棋盘状态、 Action 和奖励输入到训练步骤中。
self.loss_policy = tf.losses.softmax_cross_entropy(self.move_result_placeholder, out_dense)
self.loss_value =
tf.losses.mean_squared_error(self.value_result_placeholder,
tf.reshape(self.out_value_layer, shape=[-1,]))
self.total_loss = self.loss_policy + self.loss_value
优化器(学习率 1e-4):
self.train_step = tf.train.AdamOptimizer(learning_rate=self.learning_rate_placeholder).minimize(self.total_loss, name="optimizer")
Softmax:
self.out_policy_layer = tf.nn.softmax(out_dense, name="out_policy_layer")
批量归一化(is_training 是一个占位符,训练时为 1,玩游戏时为 0)batch_norm_decay 为 .999:
input_bn = tf.contrib.layers.batch_norm(input_conv, center=True, scale=True, is_training=self.is_training, decay=self._config.batch_norm_decay)
正则化(层规模中所有权重的 L2 为 1e-4):
initializer=tf.contrib.layers.xavier_initializer()
if use_regularizer:
regularizer = tf.contrib.layers.l2_regularizer(scale=self._config.l2_regularizer_scale)
weights = tf.get_variable(name, shape=shape, initializer=initializer, regularizer=regularizer)
型号说明:
该模型是在 tensorflow 中创建的,由一个 4x8x3(批量大小 1024)的输入层组成。这捕获了 4x8 棋盘的状态、自玩家得分以来已进行的步数以及在特定游戏中该棋盘状态出现的次数。其输入到内核大小为 3x3 且步幅 = 1 的 conv2d 层。然后,我应用 BatchNormalization tf.contrib.layers.batch_norm(input_conv, center=True,scale=True, is_training=self.is_training, Decay=self._config.batch_norm_decay)
和 relu。输入 relu 末尾的大小为 4x8x64。
之后还有 5 个残差 block 。在残差 block 之后,它分成两部分。第一个是策略网络输出,它通过另一个内核大小为 1x1、步幅为 1 的卷积层以及批量归一化和 ReLU 来运行它。此时它是 4x8x2,它被展平并穿过一个密集层,然后到 softmax 输出 256 个输出,这些输出代表它选择任何给定移动的可能性。 256 个输出映射到 4x8 棋盘,并带有棋子移动方向的平面。因此,第一个 4x8 会告诉您选择一 block 并将其向西北移动的几率。第二个会告诉你选择一 block 棋子并将其移动到东北等的几率。
分割的另一边是值输出。在这一侧,它经过一个卷积层,然后被展平,经过一个致密层,最后经过一个 TanH,因此它输出一个值,告诉我们该板状态的质量。
所有层的权重都使用 L2 正则化 (1e-4)。
损失是策略方面的交叉熵和值(value)方面的均方误差,我使用的是 Adam 优化器。
最佳答案
如果我是你,我会研究张量板的 tensorflow 调试器插件。您会发现使用这个工具,可以很容易地通过图表追踪问题。
您可以在图表中逐步进行计算,还可以跟踪弹出的 NaN 值的出现情况。
https://github.com/tensorflow/tensorboard/tree/master/tensorboard/plugins/debugger
关于python - Tensorflow 模型在训练期间充满 NaN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49702179/
我有一个问题,但由于 this question 部分正在解决,但我想知道如何计算给定间隔之间的天数。 这是一个计算员工休假天数的查询。所以给定(或不给定)一个日期范围,我想计算给定间隔之间有多少假期
变量dateSubtract结果是 16,但我想找到这 2 天之间的总天数,应该是 165。没有 JODA TIME 我该如何做到这一点? String date = "06/17/2014"; Da
我想选择创建日期介于给定月份的第一天和最后一天之间的记录。我通过以下方式计算开始日期和结束日期的月份: 日期“月份”只是时间范围内的随机日期 Calendar cal = Calendar.getIn
我有一个对你们大多数人来说可能微不足道的问题。我尝试了很多,没有找到解决方案,所以如果有人能给我提示,我会很高兴。起点是每周 xts -时间序列。 月周值(value)目标 2011 年 12 月 W
我有一个 Facebook 应用程序,它将用户生日作为 varchar 存储在 mysql 数据库中。我正在尝试获取所有用户的生日 1周后推出,如果是在本周如果生日是上周。 在我的 php 中,我获取
我正在使用以下代码来获取年、月、日中的两个日期之间的差异 tenAppDTO.getTAP_PROPOSED_START_DATE()=2009-11-01 tenAppDTO.getTAP_PRO
我想检查当前时间(在 C++ 中)是否在一个时间范围内。 我想从元组 ("12:00", "17:30") 构造时间范围,即 (string, string) 并检查时间 now() 是否介于两者之间
gitlab 有一个功能,如果我在提交消息中放入票号,那么提交将与 gitlab.com 上的票相关联。 这在进行代码审查时非常方便。不幸的是,开发人员有时会忘记这样做。 我想指定 git hooks
我正在尝试制作使用SQLite数据库的简单注册/登录应用程序,到目前为止我得到了这段代码。这是我的“注册” Activity ,我猜它应该在按下注册按钮后将用户名和 pin(密码)实现到数据库,遗憾的
我正在尝试打开、关闭和写入文件。每当我尝试打开一个文件时,如果我提供的路径中不存在该文件,程序就会告诉我。如果存在,程序将读取其中的内容并显示它。如果用户不想查找文件,可以选择创建文件并用数据填充它。
我想要我的至slideToggle每当发生 react 性变化时,但到目前为止我还无法使其发生。我尝试在 rendered 中使用 JQuery和created模板的事件,但它没有触发。 触发此操作的
我们的 MySQL 遇到了神秘的网络问题。简单的更新查询(使用索引更新单行)通常会立即运行,然后有时(假设 1000 次中有 1 次)因超时而失败。与简单的插入查询相同。数据库没有过载。我们怀疑网络问
我正在使用 actionbarsherlock 的 ActionBar,第一次以横向或水平方向运行应用程序时,选项卡以 Tabs Mode 显示。将方向更改为纵向后,导航模式仍在 Tabs 中。第二次
每天晚上(太平洋标准时间晚上 8 点)我都会对生产数据库(innoDB 引擎)进行全局备份。 这是 mysqldump 命令: mysqldump -u$MYSQLUSER -p$MYSQLPWD -
当我的应用程序第一次启动时,它应该显示用户协议(protocol),这是一个 59kb 的 txt 文件。由于读取文件并将其附加到 TextView 需要一些时间,因此我决定在异步任务中执行此操作并在
如何只允许一个“.”在按键期间的javascript中? 我这里有一个代码: function allowOneDot(txt) { if ((txt.value.split(".")
我已经创建了像主页和用户这样的标题图标。在桌面 View 中,如果我单击用户图像,它会显示相应的重定向页面。如果我在选项卡或移动 View 中将其最小化, 它什么都不显示。此问题仅发生在用户图像上,而
下面的代码在 Release模式下工作,并且仅在 Debug模式下在 g_ItemList.push_back() 引发错误,我浏览了一些 SO 帖子和论坛。有人提到 "You can't itera
我遇到了一个我似乎无法解决的 mmap 问题。下面是设置:我使用 malloc 将一个巨大的多维数组分配到内存中,用我的值填充它,然后我想将它保存在一个文件中。该数组包含 3200000000 个字节
尝试加载共享库: handle = dlopen( "libaaa.so.2.5", RTLD_NOW ); if ( !handle ) { printf("Failed t
我是一名优秀的程序员,十分优秀!