【发布时间】:2019-06-16 03:29:20
【问题描述】:
我正在通过定义一个由 keras 的 tf 后端和一些 tf 的张量运算符自己编写的新类来构建一个带有自定义激活函数的 Keras 序列模型。我把自定义激活函数放在../keras/advanced_activation.py.
我打算使用 float16 精度运行它。如果没有自定义函数,我可以使用以下方法轻松地在 float32 和 float16 之间进行选择:
if self.precision == 'float16':
K.set_floatx('float16')
K.set_epsilon(1e-4)
else:
K.set_floatx('float32')
K.set_epsilon(1e-7)
然而,当我的模型中包含自定义函数时,即使我选择了 float16,tf 似乎仍然存在于 float32 中。我知道 tf 默认在 flat32 下运行,所以我的问题是:
在同一个文件中还有几个内置的激活函数,Keras 是如何让它们在 float16 下运行的,以便我可以做同样的事情?有一个 tf 方法 tf.dtypes.cast(...),我可以在我的自定义函数中使用它来强制 tf 吗?这些内置函数中没有这样的演员表。
另外,如何通过使用 Keras 和 tf 作为后端来强制 tf 在 float16 下直接运行?
非常感谢。
【问题讨论】:
-
作为一种肮脏的解决方法(或进一步调试它的方法),我可能会在每次应用自定义函数时推荐 tf.dtypes.cast() 。如果没有,如果您更详细地描述您的自定义函数,它可能会很有用。是纯 TF 还是涉及调用 C++?
-
纯粹是用 tf.例如,一个段看起来像
inputss = tf.where(tf.math.logical_and(tf.greater(orig, 0), tf.less(orig, 0.25)), 0.25 / (1+tf.exp(-self.sharp*((inputss-0.125)/0.25))), inputss)我想我会尝试强制转换,但是你知道我可以通过哪种方式判断是否在我的函数中应用了强制转换,即我可以使用哪个 tf 变量来调用是否应用强制转换的条件操作? -
使用
tf.constant将这些常量(如 0.125 和 0.25)包装在所需的dtype中。 TF 可能会向上转换为float32,因为这些默认dtype。
标签: json tensorflow keras