我想使用tf.keras.layers.experimental.preprocessing.PreprocessingLayer
层来创建一个自定义的预处理层。
在这个自定义层中,我希望在输入层之后对我的图像进行归一化处理,使用tf.cast(img, tf.float32) / 255.
我试图找到一些代码或示例,展示如何创建这个预处理层,但没有找到。
请问,有人可以提供一个完整的示例,展示如何创建和使用PreprocessingLayer层吗?
回答:
如果你想拥有一个自定义的预处理层,实际上你不需要使用PreprocessingLayer
。你可以简单地继承Layer类
以最简单的预处理层Rescaling为例,它位于tf.keras.layers.experimental.preprocessing.Rescaling
命名空间下。然而,如果你查看实际的实现,它只是继承了Layer
类,源代码链接在此,但带有@keras_export(‘keras.layers.experimental.preprocessing.Rescaling’)
@keras_export('keras.layers.experimental.preprocessing.Rescaling')class Rescaling(Layer): """通过`scale`乘以输入并加上`offset`。 例如: 1. 要将[0, 255]范围内的输入重新缩放到[0, 1]范围内,你可以传递`scale=1./255`。 2. 要将[0, 255]范围内的输入重新缩放到[-1, 1]范围内,你可以传递`scale=1./127.5, offset=-1`。 重新缩放在训练和推理过程中都会应用。 输入形状: 任意。 输出形状: 与输入相同。 参数: scale: 浮点数,应用于输入的缩放比例。 offset: 浮点数,应用于输入的偏移量。 name: 字符串,层的名称。 """ def __init__(self, scale, offset=0., name=None, **kwargs): self.scale = scale self.offset = offset super(Rescaling, self).__init__(name=name, **kwargs) def call(self, inputs): dtype = self._compute_dtype scale = math_ops.cast(self.scale, dtype) offset = math_ops.cast(self.offset, dtype) return math_ops.cast(inputs, dtype) * scale + offset def compute_output_shape(self, input_shape): return input_shape def get_config(self): config = { 'scale': self.scale, 'offset': self.offset, } base_config = super(Rescaling, self).get_config() return dict(list(base_config.items()) + list(config.items()))
所以这证明Rescaling
预处理只是另一个普通层。
主要部分是def call(self, inputs)
函数。你可以创建任何复杂的逻辑来预处理你的inputs
然后返回。
关于自定义层的更简单文档可以在这里找到
简而言之,你可以通过层来进行预处理,无论是通过Lambda进行简单操作,还是通过继承Layer来实现你的目标。