Иногда нам нужно предварительно обработать данные, пропустив их через слои предварительная обработка. Это становится проблематичным, когда ваша модель является автоэнкодером, и в этом случае входными данными являются как x, так и y.
Поправьте меня, если я ошибаюсь, и, возможно, есть другие способы обойти это, но мне кажется очевидным, что если истинный ввод, скажем, [1,2,3]
, и я масштабирую это до 0 и 1: [0,0.5,1]
, то модель должна оценивать автоэнкодер на основе x=[0,0.5,1]
и y=[0,0.5,1]
, а не x=[1,2,3]
. Итак, если моя модель, например:
[
preprocess_1,
preprocess_2,
encode1,
...
decode1
]
Как мне передать вывод [preprocess_1, preprocess_2]
моей модели как y
?
Одним из очевидных решений является предварительная обработка перед моделью (например, в tft preprocessing_fn
), но у этого есть свои недостатки. Например, я предполагаю, что выполнение этого вне модели означает, что вы не получите полного преимущества любого графического процессора/ускорителя, к которому модель имеет доступ. Другая причина заключается в том, что пакет предварительная обработка обеспечивает лучшую поддержку. Выполнение этого за пределами слоев предварительной обработки означает, что вам придется написать часть кода самостоятельно.
Вам просто нужно изменить свою функцию потерь, чтобы свести к минимуму разницу между прогнозами и масштабированными входными данными.
Это можно сделать с помощью модель.add_loss.
Учитывая фиктивную задачу реконструкции, где мы должны восстановить эти данные:
X = np.random.uniform(0,255, (300,10))
используя этот автоэнкодер:
inp = Input(shape=(10,))
prepocess_inp = Rescaling(scale=1./255)(inp) # PREPROCESSING LAYER
x = Dense(64)(prepocess_inp)
x = Dense(16)(x)
x = Dense(64)(x)
out = Dense(10)(x)
model = Model(inputs=inp, outputs=out)
Вы должны вручную добавить потери таким образом, чтобы учесть предварительную обработку, примененную к входным данным:
model.add_loss( tf.keras.losses.mean_absolute_error( prepocess_inp, out ) )
model.compile(optimizer='adam', loss=None)
Обучение рассчитывается как обычно:
model.fit(X, X, epochs=10, batch_size = 32)