Тренировка на преобразованном выходе

#python #keras #tf.keras

#python #keras #tf.keras

Вопрос:

У меня есть модель рекуррентной нейронной сети, которая сопоставляет (N,) последовательность с (N,3) последовательностью длины. Мои целевые выходные данные на самом деле (N,N) являются матрицами. Однако у меня есть детерминированная функция, реализованная в numpy, которая преобразует (N,3) в эти (N,N) матрицы определенным образом, который я хочу. Как я могу использовать эту операцию в обучении? Т.е. в настоящее время моя нейронная сеть выдает (N,3) последовательности, как мне выполнить свою функцию, чтобы преобразовать ее (N,N) в них перед вызовом keras.fit ?

Редактировать: я должен также отметить, что гораздо сложнее выполнить обратную функцию from (N,N) to (N,3) , поэтому невозможно просто преобразовать мои целевые выходные данные в (N,3) выходные представления.

Ответ №1:

Вы можете использовать лямбда-слой в качестве последнего слоя вашей модели:

 def convert_to_n_times_n(x):
    # transform x from shape (N, 3) to (N, N)

transformation_layer = tf.keras.layers.Lambda(convert_to_n_times_n)
  

Вероятно, вы хотите использовать « tf собственные методы» в своей функции как можно больше, чтобы избежать ненужных преобразований тензоров в массивы numpy и обратно.

Если вы хотите использовать слой только во время обучения, но не во время вывода, вы можете добиться этого с помощью функционального API:

 # create your original model (N,) -> (N, 3)
input_ = Input(shape=(N,))
x = SomeFancyLayer(...)(input_)
x = ...
...
inference_output = OtherFancyLayer(...)(x)

inference_model = Model(inputs=input_, outputs=inference_output)

# create amp; fit the training model
training_output = transformation_layer(inference_output)
training_model = Model(inputs=input_, outputs=training_output)

training_model.compile(...)
training_model.fit(X, Y)

# run inference using your original model
inference_model.predict(...)