Объединенная сумма функций - ошибка формы - PullRequest
0 голосов
/ 08 июня 2018

У меня есть модель в Керасе, в которой я хочу явно заставить нейронную сеть взглянуть на сумму нескольких функций.Я пытаюсь сделать это так:

sum_input_p = Lambda(sumFunc)(input_p)
d_input = keras.layers.concatenate(
    [input_p, cont_cond, sum_input_p, one_hot_cond_1, one_hot_cond_2 ], axis=-1)

где

def sumFunc(x):
   return K.reshape(K.sum(x), [1])

Но я получаю ошибку:

ValueError: Concatenate слой требует вводас соответствующими формами, за исключением конкатной оси.Получил входные формы: [(Нет, 267), (Нет, 1), (1,), (Нет, 4), (Нет, 2)]

Это из-за reshape шаг в sumFunc?Как я могу изменить его правильно, чтобы он мог быть объединен с остальными функциями в нейронной сети?

1 Ответ

0 голосов
/ 08 июня 2018

Это потому, что K.sum() (K.reshape() на самом деле тоже не нужен).

Все остальные тензоры (input_p, cont_cond и т. Д.) Все еще содержат пакетные выборки, которые я предполагаю(то есть их формы (batch_size, num_features), с batch_size = None, как это определено только при запуске графика).Таким образом, вы, вероятно, хотите, чтобы sum_input_p имел форму (batch_size, 1), то есть вычислял сумму по всем измерениям вашего входного тензора x, кроме первого измерения (соответствующего размеру пакета).

import keras
import keras.backend as K
from keras.layers import Input, Lambda
import numpy as np

def sumFunc(x):
    x_axes = np.arange(0, len(x.get_shape().as_list()))
    # ... or simply x_axes = [0, 1] in your case, since the shape of x is known
    y = K.sum(x, axis=x_axes[1:])   # y of shape (batch_size,)
    y = K.expand_dims(y, -1)        # y of shape (batch_size, 1)
    return y


input_p = Input(shape=(267,))
sum_input_p = Lambda(sumFunc)(input_p)
print(sum_input_p)
# > Tensor("lambda_1/ExpandDims:0", shape=(?, 1), dtype=float32)
d_input = keras.layers.concatenate([input_p, sum_input_p], axis=-1)
print(d_input)
# > Tensor("concatenate_1/concat:0", shape=(?, 268), dtype=float32)
...