python - Tensorflow 模型在训练期间充满 NaN

标签 python tensorflow machine-learning deep-learning

我基本上是在玩复制 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/

相关文章:

python - 如何在 Django 中跨外键关系使用任何/存在/所有逻辑检索查询集?

python - 如何使用列值作为 PySpark 中字典的键?

r - 比较 Octave ML 结果与R结果

python - Wasserstein 损失可以是负数吗?

python - 值错误 : unichr() arg not in range(0x10000) (narrow Python build)

python - 在 Pyramid 中实现 Facebook BigPipe 系统

python - tensorflow 行为 : gradient computation across multi-GPU

python - 两种不同输入样本大小的 Keras 多任务学习

python - 如何获得张量/矩阵中列正元素的中值?

python - 桑尼 : installing tensorflow and importing it