Json 如何强制Tensorflow在浮动16下运行?

Json 如何强制Tensorflow在浮动16下运行?,json,tensorflow,keras,Json,Tensorflow,Keras,我通过定义Keras的tf后端和一些tf的张量操作符自己编写的新类,用自定义激活函数构建Keras的序列模型。我将自定义激活功能放在../keras/advanced_activation.py中 我打算使用float16精度运行它。如果没有自定义函数,我可以使用以下选项轻松地在float32和float16之间进行选择: 如果self.precision==“float16”: K.set_floatx(‘float16’) K.set_ε(1e-4) 其他: K.set_floatx(‘fl

我通过定义Keras的tf后端和一些tf的张量操作符自己编写的新类,用自定义激活函数构建Keras的序列模型。我将自定义激活功能放在../keras/advanced_activation.py中

我打算使用float16精度运行它。如果没有自定义函数,我可以使用以下选项轻松地在float32和float16之间进行选择:

如果self.precision==“float16”:
K.set_floatx(‘float16’)
K.set_ε(1e-4)
其他:
K.set_floatx(‘float32’)
K.set_ε(1e-7)
然而,当在我的模型中加入自定义函数时,tf似乎仍然存在于float32中,即使我选择了float16。我知道tf默认在flat32下运行,所以我的问题是:

  • 在同一个文件中还有几个内置的激活函数,Keras是如何让它们在float16下运行的,这样我就可以做同样的事情了?有一个tf方法tf.dtypes.cast(…),我可以在自定义函数中使用它强制tf吗?这些内置函数中没有这样的强制转换

  • 或者,我如何通过使用Keras和tf作为后端,强制tf直接在float16下运行


  • 非常感谢。

    我通过调试得到了答案。教训是

    首先,tf.dtypes.cast(…)起作用

    其次,我可以在自定义激活函数中指定第二个参数,以指示强制转换的数据类型(…)。以下是相关代码

    第三,我们不需要tf.constant来指示这些常量的数据类型

    第四,我得出结论,在custom_activation.py中添加一个自定义函数是定义我们自己的层/激活的最简单的方法,只要它在任何地方都是可微的,或者至少是明智地可微的,并且在连接处没有间断

    #四片式常数函数
    类MyFunc(层):
    定义初始化(self,sharp=100,数据类型='float32',**kwargs):
    超级(MyFunc,self)。\uuuuuu初始化(**kwargs)
    self.supports\u masking=True
    self.sharp=K.cast\u to\u floatx(sharp)
    self.DataType=数据类型
    def呼叫(自我,输入):
    inputss=tf.dtypes.cast(输入,dtype=self.DataType)
    orig=输入
    #一些计算
    返回#我的#结果
    def get_配置(自身):
    config={'sharp':float(self.sharp),
    “数据类型”:self.DataType}
    base_config=super(MyFunc,self).get_config()
    return dict(list(base_config.items())+list(config.items())
    def计算输出形状(自身、输入形状):
    返回输入形状
    

    感谢@y.selivonchyk与我进行的有价值的讨论,感谢@Yolo Swaggins的贡献。

    作为一种肮脏的解决方法(或进一步调试的方法),每次应用自定义函数时,我都建议使用tf.dtypes.cast()。如果不是的话,如果您能更详细地描述一下您的自定义函数,它可能会很有用。它是纯TF还是包含C++调用?它纯粹是用TF编写的。例如,一个片段看起来像
    inputss=tf.where(tf.math.logical_和(tf.better(orig,0),tf.less(orig,0.25)),0.25/(1+tf.exp(-self.sharp*((inputss-0.125)/0.25)),inputss)
    我想我会尝试cast,但是你知道我用什么方式来判断cast是否应用于我的函数,也就是说,我可以使用哪个tf变量来调用应用或不应用强制转换的条件操作?使用
    tf.constant
    在所需的
    dtype
    中封装这些常量,如0.125和0.25。TF可能会向上转换为
    float32
    ,因为它们的默认
    dtype