tensorflow 0.10.0rc版本是否支持float16



为了减少张量,我在模型中用dytpe=tf.float16定义了所有变量,然后定义了优化器:

optimizer = tf.train.AdamOptimizer(self.learning_rate)
self.compute_gradients = optimizer.compute_gradients(self.mean_loss_reg)
train_adam_op = optimizer.apply_gradients(self.compute_gradients, global_step=self.global_step)

一切正常!但是在我运行train_aam_op之后,python中的梯度和变量是nan。我想知道apply_gradients() API是否支持tf.float16类型?为什么我在apply_gradients()session.run()呼叫后感到不安。。。。

fp16的动态范围与32位浮点相比相当有限。因此,它们很容易上溢或下溢,这通常会导致您遇到的NaN。

您可以在模型中插入一些check_numerics操作,以帮助精确定位在fp16上执行时变得不稳定的特定操作。

例如,您可以将L2丢失操作包装如下,以检查其结果是否符合fp16

A = tf.l2_loss(some_tensor)

成为

A = tf.check_numerics(tf.l2_loss(some_tensor), "found the root cause")

溢出和下溢最常见的来源是exp()、log()以及各种分类基元,所以我会从那里开始查找。

一旦您确定了哪一个操作序列有问题,您就可以更新模型,使用32位浮点执行该序列,方法是使用tf.cast()将序列的输入转换为32位浮点,并将结果强制转换回fp16。

最新更新