does tensorflow 0.10.0rc版本支持float16吗?

问题描述:

为了降低张量,我定义的所有dytpe=tf.float16变量在我的模型,然后定义优化:does tensorflow 0.10.0rc版本支持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) 

一切正常,OK!但是在我运行train_adam_op之后,渐变和变量在python中是nan。我漫步如果apply_gradients() API支持tf.float16类型?为什么我得到nan后apply_gradients()session.run()调用....

+0

执行'apply_gradients'操作后,'loss'变成了''nan'在Python中。所以我怀疑tensorflow的'apply_gradients' API是否支持tf.float16? –

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

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

例如,可以作为按照以检查它的结果适合在FP16紧裹L2损失操作

A = tf.l2_loss(some_tensor)

变得

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

溢出的最常见的来源和下溢是exp(),log()以及各种分类原语,所以我会开始在那里寻找。

一旦找出哪个操作序列有问题,可以使用tf.cast()将序列的输入转换为32位浮点数来更新模型以使用32位浮点数执行该序列,并且将结果转换回fp16。

+0

非常感谢你!我会试一试。 –

+0

我添加了'tf.check_numerics()'检查模型定义中的一些操作,但是现在我得到了'LookupError:没有为操作'training/loss/CheckNumerics'(op类型:CheckNumerics)'错误定义的渐变。如何避免这个错误?请给我一些建议 –

+0

非常感谢。我已经解决了这个问题。对'apply_gradients()'API使用'epsilon'参数。 –