Как создать собственный PreprocessingLayer в TF 2.2 - PullRequest
0 голосов
/ 30 мая 2020

Я хотел бы создать настраиваемый слой предварительной обработки, используя слой tf.keras.layers.experimental.preprocessing.PreprocessingLayer.

В этом настраиваемом слое, помещенном после входного слоя, я хотел бы нормализовать свое изображение, используя tf.cast(img, tf.float32) / 255.

Я попытался найти код или пример, показывающий, как создать этот слой предварительной обработки, но не смог найти.

Пожалуйста, может ли кто-нибудь предоставить полный пример создания и использования слоя PreprocessingLayer?

Ответы [ 2 ]

2 голосов
/ 02 июня 2020

Я думаю, что лучшее и более чистое решение для этого - использовать простой слой 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)
0 голосов
/ 05 июня 2020

Если вы хотите иметь собственный уровень предварительной обработки, на самом деле вам не нужно использовать 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):
  """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()))

Таким образом, это доказывает, что предварительная обработка Rescaling - это просто еще один нормальный слой.

Основная часть - это функция def call(self, inputs). Вы можете создать любой сложный logi c, чтобы предварительно обработать ваш inputs, а затем вернуть.

Более простую документацию о настраиваемом слое можно найти здесь

В двух словах , вы можете выполнять предварительную обработку по слоям, либо с помощью Lambda для простой операции, либо путем создания подкласса Layer для достижения вашей цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...