Как перехватывать и передавать внутриуровневые выходные данные в качестве целевых данных

Иногда нам нужно предварительно обработать данные, пропустив их через слои предварительная обработка. Это становится проблематичным, когда ваша модель является автоэнкодером, и в этом случае входными данными являются как 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), но у этого есть свои недостатки. Например, я предполагаю, что выполнение этого вне модели означает, что вы не получите полного преимущества любого графического процессора/ускорителя, к которому модель имеет доступ. Другая причина заключается в том, что пакет предварительная обработка обеспечивает лучшую поддержку. Выполнение этого за пределами слоев предварительной обработки означает, что вам придется написать часть кода самостоятельно.

Udacity Nanodegree Capstone Project: Классификатор пород собак
Udacity Nanodegree Capstone Project: Классификатор пород собак
Вы можете ознакомиться со скриптами проекта и данными на github .
1
0
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам просто нужно изменить свою функцию потерь, чтобы свести к минимуму разницу между прогнозами и масштабированными входными данными.

Это можно сделать с помощью модель.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)

Другие вопросы по теме

Похожие вопросы

Хронологически распространение данных в Keras LSTM
Как показать больше изображений, чем значение размера пакета?
Я получаю эту ошибку при попытке обучить модель, Tensorflow ValueError: неожиданный результат `train_function` (пустые журналы)
Проверка данных tensorflow tfdv не работает в потоке данных Google Cloud с сообщением «Не удается получить атрибут« NumExamplesStatsGenerator »»
Как узнать, какая последняя версия Python совместима с Tensorflow v2.x?
ValueError: Отсутствуют данные для ввода "input_2". Вы передали словарь данных с ключами ['y', 'x']. Ожидаются следующие ключи: ['input_2']
Не удалось сжать dim[1], ожидалось, что размерность будет равна 1, получено 2
Вход 0 слоя «модель» несовместим со слоем: ожидаемая форма = (Нет, 250, 3), найденная форма = (Нет, 3) в обученной модели трансформатора
«не может вычислить Pack, так как вход № 1 (с отсчетом от нуля) должен был быть тензором с плавающей запятой, но это тензор int32 [Op: Pack] имя: упаковано». Ошибка с tf.squeeze
Невозможно предсказать набор данных с разным разрешением