Поезд на преобразованном выходе - PullRequest
0 голосов
/ 12 апреля 2019

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

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

1 Ответ

1 голос
/ 12 апреля 2019

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

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

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