Python 如何在TF2.2中创建自定义预处理层

Python 如何在TF2.2中创建自定义预处理层,python,tensorflow,keras,tensorflow2.0,Python,Tensorflow,Keras,Tensorflow2.0,我想使用tf.keras.layers.experimental.preprocessing.PreprocessingLayer层创建一个自定义预处理层 在这个位于输入层之后的自定义层中,我想使用tf.cast(img,tf.float32)/255规范化我的图像。 我试图找到一些代码或示例来说明如何创建这个预处理层,但找不到 请,有人能提供一个完整的例子来创建和使用预处理层吗?我认为最好的、更干净的解决方案是使用一个简单的Lambda层,在这个层中可以包装预处理功能 这是一个虚拟的工作示例

我想使用
tf.keras.layers.experimental.preprocessing.PreprocessingLayer
层创建一个自定义预处理层

在这个位于输入层之后的自定义层中,我想使用
tf.cast(img,tf.float32)/255规范化我的图像。

我试图找到一些代码或示例来说明如何创建这个预处理层,但找不到


请,有人能提供一个完整的例子来创建和使用预处理层吗?

我认为最好的、更干净的解决方案是使用一个简单的Lambda层,在这个层中可以包装预处理功能

这是一个虚拟的工作示例

import numpy as np
from tensorflow.keras.layers import *
from tensorflow.keras.models import *


X = np.random.randint(0,256, (200,32,32,3))
y = np.random.randint(0,3, 200)

inp = Input((32,32,3))
x = Lambda(lambda x: x/255)(inp)
x = Conv2D(8, 3, activation='relu')(x)
x = Flatten()(x)
out = Dense(3, activation='softmax')(x)

m = Model(inp, out)
m.compile(loss='sparse_categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
history = m.fit(X, y, epochs=10)

如果您想要自定义预处理层,实际上不需要使用
PreprocessingLayer
。您只需将层子类化即可

以最简单的预处理层为例,它位于
tf.keras.layers.experimental.preprocessing.Rescaling
命名空间下。但是,如果您检查实际的实现,它只是子类
Layer
类,但具有@keras\u导出('keras.layers.experimental.preprocessing.Rescaling')

因此,它证明了
重新缩放
预处理只是另一个普通层

主要部分是
def调用(self,inputs)
功能。您可以创建任何复杂的逻辑来预处理
输入
,然后返回

可以找到有关自定义图层的更简单文档


简而言之,您可以按层进行预处理,可以通过Lambda进行简单操作,也可以通过对层进行子类化来实现您的目标。

@palazoo train如果预处理涉及对批次的每个图像分别进行预处理,例如,如果我对输入图像进行了特征提取预处理,我希望预处理层给我形状的输出(无,预处理的输出),但我认为这会引起错误,因为自定义预处理函数(不是层)希望一次只输出一张图像,而不是一批图像。你知道怎么解决吗?
@keras_export('keras.layers.experimental.preprocessing.Rescaling')
class Rescaling(Layer):
  """Multiply inputs by `scale` and adds `offset`.
  For instance:
  1. To rescale an input in the `[0, 255]` range
  to be in the `[0, 1]` range, you would pass `scale=1./255`.
  2. To rescale an input in the `[0, 255]` range to be in the `[-1, 1]` range,
  you would pass `scale=1./127.5, offset=-1`.
  The rescaling is applied both during training and inference.
  Input shape:
    Arbitrary.
  Output shape:
    Same as input.
  Arguments:
    scale: Float, the scale to apply to the inputs.
    offset: Float, the offset to apply to the inputs.
    name: A string, the name of the layer.
  """

  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()))