попытка объединить два слоя в керасах с одинаковой формой, что приводит к ошибке в сопоставлении форм - PullRequest
0 голосов
/ 24 ноября 2018

Я пытаюсь построить модель с несколькими входами и несколькими выходами, используя keras function api , и я слежу за их кодом, но я получил эту ошибку:

ValueError: AДля слоя Concatenate требуются входные данные с соответствующими формами, за исключением оси concat.Получил входные формы: [(Нет, 50), (Нет, 50, 1)]

Я пропустил слой Embedded, вот код:

def build_model(self):
    main_input = Input(shape=(self.seq_len, 1), name='main_input')
    print(main_input.shape)
    # seq_len = 50
    # A LSTM will transform the vector sequence into a single vector,
    # containing information about the entire sequence
    lstm_out = LSTM(self.seq_len,input_shape=(self.seq_len,1) )(main_input)
    self.auxiliary_output = Dense(1, activation='sigmoid', name='aux_output')(lstm_out)

    auxiliary_input = Input(shape=(self.seq_len,1), name='aux_input')
    print(auxiliary_input.shape)
    x = concatenate([lstm_out, auxiliary_input])

    # We stack a deep densely-connected network on top
    x = Dense(64, activation='relu')(x)
    x = Dense(64, activation='relu')(x)
    x = Dense(64, activation='relu')(x)

    # And finally we add the main logistic regression layer
    main_output = Dense(1, activation='sigmoid', name='main_output')(x)
    self.model = Model(inputs=[main_input, auxiliary_input], outputs=[main_output, auxiliary_output])
    print(self.model.summary())
    self.model.compile(optimizer='rmsprop', loss='binary_crossentropy',
              loss_weights=[1., 0.2])

Iполучил эту ошибку на этапе объединения, хотя печать формы обоих слоев (?, 50,1).Я не знаю точно, почему я получил это, и какова точная ошибка в input_shape первого слоя и почему он не дает мне такую ​​же форму, как это должно быть при использовании print(main_input.shape), и как ее решить?

ОБНОВЛЕНИЕ:

Я нашел решение для ошибки, изменив форму второго входного слоя

auxiliary_input = Input(shape=(self.seq_len,), name='aux_input')

, так что теперь они могут плавно соединяться,но до сих пор не понятно, почему?

1 Ответ

0 голосов
/ 25 ноября 2018

Для второго ввода вы указали перед ошибкой, что

input_shape = (50,1)# seq_length=50

Это означает, что конечная форма будет:

(None,50,1)

Теперь, когда первый вход проходит через LSTM, поскольку вы не указали return_sequences=True, он вернет тензор формы (batch_size, units), а именно.(None, 50), который вы объединяете с вышеупомянутым (None, 50, 1)

Ваша ошибка исчезла, потому что вы изменили форму ввода для второго ввода как (50,), так что конечная форма становится (None,50), которая соответствует выходуLSTM и, следовательно, он соединяется плавно

...