Слой Keras Lambda для выполнения максимума и вывода в форме (?, 1) - PullRequest
1 голос
/ 21 июня 2020

У меня две модели прогнозирования; детерминированность c и сеть глубокого обучения. Я хотел бы объединить две модели, в которых детерминированная c одна обеспечивает основу для прогнозирования, а глубокое обучение вносит необходимые корректировки. Это проблема регрессии с выходом с плавающей запятой.

Последний уровень сети глубокого обучения:

Dense(1, activation='linear',kernel_initializer=init) (previous_layer_output)

Таким образом, его выходная форма просто (?, 1). Форма вывода модели Deterministi c должна быть идентична, чтобы мой слой слияния работал.

Модель Deterministi c принимает входной слой, который имеет форму (?, 10, 1) и должен принимать максимальное значение 10 значений и вывод в форме (?, 1).

Код ниже, который берет 10 фрагментов и выполняет над ними Maximum (), работает отлично. Однако это выглядит громоздко, и я не думаю, что это правильный способ сделать это.

#print(x_test_scaled.shape[1:]) = (10, 1)

Det_Guess1 = Lambda(lambda x: x[:,0], input_shape=x_test_scaled.shape[1:], output_shape=(1,)) (Input_Layer)
Det_Guess2 = Lambda(lambda x: x[:,1], input_shape=x_test_scaled.shape[1:], output_shape=(1,)) (Input_Layer)
Det_Guess3 = Lambda(lambda x: x[:,2], input_shape=x_test_scaled.shape[1:], output_shape=(1,)) (Input_Layer)
Det_Guess4 = Lambda(lambda x: x[:,3], input_shape=x_test_scaled.shape[1:], output_shape=(1,)) (Input_Layer)
Det_Guess5 = Lambda(lambda x: x[:,4], input_shape=x_test_scaled.shape[1:], output_shape=(1,)) (Input_Layer)
Det_Guess6 = Lambda(lambda x: x[:,5], input_shape=x_test_scaled.shape[1:], output_shape=(1,)) (Input_Layer)
Det_Guess7 = Lambda(lambda x: x[:,6], input_shape=x_test_scaled.shape[1:], output_shape=(1,)) (Input_Layer)
Det_Guess8 = Lambda(lambda x: x[:,7], input_shape=x_test_scaled.shape[1:], output_shape=(1,)) (Input_Layer)
Det_Guess9 = Lambda(lambda x: x[:,8], input_shape=x_test_scaled.shape[1:], output_shape=(1,)) (Input_Layer)
Det_Guess10 = Lambda(lambda x: x[:,9], input_shape=x_test_scaled.shape[1:], output_shape=(1,)) (Input_Layer)

Det_Guess = Maximum()([Det_Guess1, Det_Guess2, Det_Guess3, Det_Guess4,
                       Det_Guess5, Det_Guess6, Det_Guess7, Det_Guess8,
                       Det_Guess9, Det_Guess10])

#print(Det_Guess.shape) = (?, 1)

Простая лямбда-функция ниже выглядит аккуратно, но не работает, поскольку ее результат имеет скалярную форму;

def find_max(x):
    K.max(x)
    return K.max(x)

Det_Guess= Lambda(find_max, input_shape=x_test_scaled.shape[1:], output_shape=(1,)) (Input_Layer)

# print(Det_Guess.shape) = ()

Я попытался изменить форму, добавив размеры к этой более простой лямбда-функции, но не смог сохранить размерность образца (?), Я всегда теряю его, и вывод никогда не будет в форме (?, 1).

Как я могу создать аккуратно выглядящий слой с выполненной желаемой операцией, которая выводит в форме (?, 1)?

1 Ответ

1 голос
/ 21 июня 2020

попробуйте так:

inp = Input((10,1))
Det_Guess= Lambda(lambda x: tf.reduce_max(x, axis=1))(inp)
model = Model(inp, Det_Guess)
model.summary()

Layer (type)                 Output Shape              Param #   
=================================================================
input_4 (InputLayer)         [(None, 10, 1)]           0         
_________________________________________________________________
lambda_7 (Lambda)            (None, 1)                 0         
=================================================================

X = np.random.randint(0,1000, (100,10,1))
model.predict(X)
...