此页面由 Cloud Translation API 翻译。
Switch to English

tf.keras.mixed_precision.experimental.Policy

TensorFlow 1版 GitHub上查看源代码

一个D型政策的Keras层。

用在笔记本电脑

使用的指南

地D型细胞策略决定的层的D型细胞相关的方面,例如它的计算和可变dtypes。每一层有一个政策。策略可以传递到dtype层的构造函数的参数,或者一个全球性的政策可以设定tf.keras.mixed_precision.experimental.set_policy 。如果没有政策传递给它的构造函数层将默认为全球政策。

对于许多模型,每一层的政策将具有相同的计算D型和可变D型,这通常是FLOAT32。在这种情况下,我们指的是单数D型为层的D型,可以通过属性查询tf.keras.layers.Layer.dtype

当使用混合精度训练,最层将替代地具有float16或bfloat16计算D型细胞和FLOAT32变量D型,所以该层不具有单一的D型。当变量D型不匹配计算D型,变量将自动浇铸成计算D型,以避免类型错误。在这种情况下, tf.keras.layers.Layer.dtype指变量D型,而不是计算D型。见混合精密导轨 ,了解如何使用混合精度的更多信息。

某些政策也有tf.mixed_precision.experimental.LossScale实例,该实例使用tf.keras.Model s到性能损失比例。损失缩放是具有混合精度用于避免float16梯度数值下溢的技术。亏损比例仅由模型中完成的Model.fitModel.train_on_batch ,和类似的方法。层,它们是不能忽视的型号损失规模。

策略由传递字符串给构造,例如构造tf.keras.mixed_precision.experimental.Policy('float32')字符串判定计算和可变dtypes。它可以是下列情况之一:

  • 任何D类的名称,如“FLOAT32”或“float64”。这两个变量和计算dtypes将是D型。无损耗缩放默认情况下完成的。
  • “mixed_float16”或“mixed_bfloat16”:该计算是D型或float16 bfloat16,而变量D型是FLOAT32。这些政策用于混合精度训练。随着“mixed_float16”,动态损失规模默认情况下使用。 “mixed_bfloat16”的默认操作没有损失缩放,作为损失缩放是不必要与bfloat16。

如何使用混合精度在Keras模型

要在Keras模型中使用混合精度, 'mixed_float16''mixed_bfloat16'可以使用的政策。 tf.keras.mixed_precision.experimental.set_policy可以使用,如果没有政策传递给他们设置默认的策略层。例如:

tf.keras.mixed_precision.experimental.set_policy('mixed_float16')
model = tf.keras.models.Sequential([
    tf.keras.layers.Input((100,)),
    # Dense layers use global policy of 'mixed_float16', which does
    # computations in float16 while keeping variables in float32.
    tf.keras.layers.Dense(10),
    tf.keras.layers.Dense(10),
    # Softmax should be done in float32 for numeric stability. We pass
    # dtype='float32' to use float32 instead of the global policy.
    tf.keras.layers.Activation('softmax', dtype='float32')
])

另外,该政策可以传递给各个层,而不是设置与全球政策set_policy

policy = tf.keras.mixed_precision.experimental.Policy('mixed_float16')
model = tf.keras.models.Sequential([
    tf.keras.layers.Input((100,)),
    tf.keras.layers.Dense(10, dtype=policy),
    tf.keras.layers.Dense(10, dtype=policy),
    # Softmax should be done in float32 for numeric stability.
    tf.keras.layers.Activation('softmax', dtype='float32')
])

请注意'mixed_float16'政策将在默认情况下适用的损失比例Model.fitModel.train_on_batch ,和其他训练方法。如果不使用这样的方法(例如,定制的训练循环使用)和'mixed_float16'被使用时,损失尺度必须手动施加。见tf.keras.mixed_precision.experimental.LossScaleOptimizer了解详情。对于'mixed_bfloat16' ,不亏缩放完成,损失比例永远不需要手动应用。

混合精密导轨的详细信息,使用混合精度

如何在Keras模型中使用float64

使用float64类似于混合精度。无论是全球性的政策可以设置为float64,或dtype='float64'可以传递给各层。例如,设置全局策略:

tf.keras.mixed_precision.experimental.set_policy('float64')
model = tf.keras.models.Sequential([
    tf.keras.layers.Input((100,)),
    # All layers use global policy of 'float64', which does computations
    # and creates variables in float64.
    tf.keras.layers.Dense(10),
    tf.keras.layers.Dense(10),
    tf.keras.layers.Activation('softmax')
])
# Optionaly set policy back to float32 if any other models use float32
tf.keras.mixed_precision.experimental.set_policy('float32')

一个层如何使用其政策的计算D型

阿层将施放其输入端至其计算D型细胞在TensorFlow 2.例如:

x = tf.ones((4, 4, 4, 4), dtype='float64')
# `layer`'s policy defaults to float32.
layer = tf.keras.layers.Conv2D(filters=4, kernel_size=2)
# `layer` casts it's inputs to its compute dtype, which is float32, and
# does computations in float32.
y = layer(x)
y.dtype
tf.float32

注意,基本tf.keras.layers.Layer类插入转换。如果继承自己的层,你不必插入任何转换。

目前,仅在第一个参数层的张量call方法进行铸造。例如:

class MyLayer(tf.keras.layers.Layer):
  # Bug! `b` will not be casted.
  def call(self, a, b):
    return a + 1., b + 1.
a = tf.constant(1., dtype="float32")
b = tf.constant(1., dtype="float32")
layer = MyLayer(dtype="float64")
x, y = layer(a, b)
x.dtype
tf.float64
y.dtype
tf.float32

如果编写自己的层,建议只在第一个参数接受张量。这样一来,所有的张量浇铸成层的计算D型。 MyLayer因此应该写成:

class MyLayer(tf.keras.layers.Layer):
  # Now, all tensor inputs will be casted.
  def call(self, inputs):
    a, b = inputs
    return a + 1., b + 1.
a = tf.constant(1., dtype="float32")
b = tf.constant(1., dtype="float32")
layer = MyLayer(dtype="float64")
x, y = layer((a, b))
x.dtype
tf.float64
y.dtype
tf.float64

其他参数都不会自动铸造技术原因,但这可能在将来的次要版本更改。

铸造仅发生在TensorFlow 2,但如果可以启用tf.compat.v1.disable_v2_behavior()被调用与tf.compat.v1.keras.layers.enable_v2_dtype_behavior()

甲亚类层,可以防止从通过使被autocasted其输入autocast=False到层构造。例如:

class NonAutoCastingLayer(tf.keras.layers.Layer):
  def __init__(self, **kwargs):
    kwargs['autocast'] = False
    super(NonAutoCastingLayer, self).__init__(**kwargs)
  def call(self, inp):
    return inp
x = tf.ones((4, 4, 4, 4), dtype='float32')
layer = NonAutoCastingLayer(dtype='float64')
y = layer(x)  # Will not cast inputs to it's compute dtype of float64
y.dtype
tf.float32

一个层如何使用其政策的变量D型

通过创建变量的默认D类tf.keras.layers.Layer.add_weight是层的政策的变量D型。

如果图层的计算和可变dtypes不同, add_weight将包裹浮点变量具有特殊的包装被称为AutoCastVariable 。此包装是与原始变量除内使用时它施放自身到层的计算D型Layer.call 。外Layer.call ,变量没有铸造。

阿层作者可以防止变量与被包裹AutoCastVariable通过使experimental_autocast=Falseadd_weight

class MyLayer(tf.keras.layers.Layer):
 def build(self, input_shape):
   self.x = self.add_weight('x')
   self.y = self.add_weight('y', experimental_autocast=False)
policy = tf.keras.mixed_precision.experimental.Policy('mixed_float16')
layer = MyLayer(dtype=policy)
layer.build((2, 2))
layer.x
<AutoCastVariable 'x:0' shape=() dtype=float32 true_dtype=float32, numpy=...>
layer.y
<tf.Variable 'y:0' shape=() dtype=float32, numpy=...>

传递experimental_autocast=False是对于可以在内部做一些数学在变量D型,而不是计算D型层是有用的。例如,您可能希望计算变量的统计数据,如均值和方差,在变量D型。

如何编写支持混合精度和float64层。

在大多数情况下,层会自动支持混合精度和float64无需任何附加的工作,由于这一事实,在基底层自动转换的输入,创建正确类型的变量,并且在混合的精度的情况下,包装用变量AutoCastVariables

例如,这个简单的致密层,不需要任何额外的工作,以支持混合精度或float64。 Keras自动转换输入和可变到适当的D型。

class MyDense(tf.keras.layers.Layer):
  def build(self, input_shape):
    self.kernel = self.add_weight('kernel', (input_shape[-1], 10))
  def call(self, inputs):
    return tf.matmul(inputs, self.kernel)
policy = tf.keras.mixed_precision.experimental.Policy('mixed_float16')
layer = MyDense(dtype=policy)
x = np.random.rand(10, 10)
y = layer(x)
y.dtype
tf.float16

你需要额外的工作来支持混合精度或float64的主要情况是,当你创建一个新的张量,如用tf.onestf.constant 。在这种情况下,你必须创建正确的D型张量。例如,假设你修改MyDense层到的随机数添加到使用的输出tf.random.normal 。你必须通过输入D型到tf.random.normal ,确保dtypes比赛。

class MyDense(tf.keras.layers.Layer):
  def build(self, input_shape):
    self.kernel = self.add_weight('kernel', (input_shape[-1], 10))
  def call(self, inputs):
    rand = tf.random.normal(shape=inputs.shape, dtype=inputs.dtype)
    return tf.matmul(inputs, self.kernel) + rand

layer = MyDense(dtype=policy)
y = layer(x)
y.dtype
tf.float16

如果你没有通过dtype=inputs.dtypetf.random.normal ,一个TypeError会发生。这是因为D型默认为"float32" ,所以该层只会如果输入了FLOAT32工作。

name 的字符串。可以是下列值之一:

  • 任何D类的名称,如“FLOAT32”或“float64”。这两个变量和计算dtypes将是D型。
  • “mixed_float16”或“mixed_bfloat16”:该计算是D型或float16 bfloat16,而变量D型是FLOAT32。随着“mixed_float16”,使用动态损失规模。这些政策用于混合精度训练。
loss_scale tf.mixed_precision.experimental.LossScale ,一个int(其利用了FixedLossScale ),或字符串“动态”(其利用了DynamicLossScale )。默认使用无损失缩放除非name是“mixed_float16”,在这种情况下,这默认为“动态”。只有tf.keras.Model S,没有层,使用的损失规模,以及它在仅用于Model.fitModel.train_on_batch ,以及其他类似的方法。

compute_dtype 这一政策的计算D型。

这是D型细胞层将尽自己的计算英寸

请注意,即使计算D型是float16或bfloat16,硬件设备可能无法做到单独加,乘,和其他基本操作在[B] float16,而是可能会做一些他们在FLOAT32的数值稳定性。计算是D型的TensorFlow OPS该层执行的输入和输出的D型。在内部,许多TensorFlow OPS会做某些内部计算在FLOAT32,或以比并[b] float16精度更高一些其它设备内部中间格式,以增加数值稳定性。

例如, tf.keras.layers.Dense层,当在具有float16计算D型GPU上运行,将通过float16输入tf.matmul。但是,tf.matmul将做使用FLOAT32中间数学。 float16的性能益处是仍然明显,由于增加的存储器带宽和事实现代GPU具有专门硬件上float16计算matmuls同时仍然保持中间计算中FLOAT32。

loss_scale 返回此政策的损失规模。
name 返回此策略的名称。
should_cast_variables 如果变量应该铸造返回True。

如果变量D型是不一样的计算D型这是真的。

variable_dtype 这一政策的变量D型。

这是D型细胞层将在创建自己的变量,除非层明确选择不同的D型。如果这是不同于Policy.compute_dtype ,图层会投变量来计算D型,以避免类型错误。

方法

from_config

查看源代码

get_config

查看源代码