Json 如何强制Tensorflow在浮动16下运行?
我通过定义Keras的tf后端和一些tf的张量操作符自己编写的新类,用自定义激活函数构建Keras的序列模型。我将自定义激活功能放在../keras/advanced_activation.py中 我打算使用float16精度运行它。如果没有自定义函数,我可以使用以下选项轻松地在float32和float16之间进行选择: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
如果self.precision==“float16”:
K.set_floatx(‘float16’)
K.set_ε(1e-4)
其他:
K.set_floatx(‘float32’)
K.set_ε(1e-7)
然而,当在我的模型中加入自定义函数时,tf似乎仍然存在于float32中,即使我选择了float16。我知道tf默认在flat32下运行,所以我的问题是:
非常感谢。我通过调试得到了答案。教训是 首先,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
。