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