Встраивание и объединение - Tensorflow Keras - PullRequest
2 голосов
/ 06 апреля 2020

Я пытаюсь скопировать нейронную сеть. Архитектура нейронной сети Модель LSTM . Первый вход представляет собой хешированное слово в виде двоичного вектора размером 2 ^ 18, которое внедряется в обучаемое 500-мерное распределенное представление, используя слой внедрения.

Количество слов отличается от каждого элемента пакета. После того, как слова были внедрены и применены исключения, мне нужно объединить вектор функций, который имеет 24 функции для каждого слова.

Проблема в том, что первый ввод после встраивания имеет разные размеры векторов объектов. Слова вставки имеют размерность (Нет, Нет, 18, 500), а векторы функций имеют размерность (Нет, Нет, 24). Первый None - это размер пакета, второй None - это количество слов для каждого элемента пакета.

Как объединить встраиваемое слово с вектором признаков?

Ниже мой код:

        inputs = Input(shape=(None, 18,), dtype=np.int16, name="Inp1")
        embbed_input = Embedding(input_dim=1, output_dim=500, input_length=18)
        aux = embbed_input(inputs)
        aux = Dropout(rate=self.dropout_rate)(aux)
        inputs_feat = Input(shape=(None, 24,), dtype=np.float32, name="Inp2")
        aux = concatenate([aux, inputs_feat], axis=2) #ValueError here 
        aux = Dense(units=600, activation="relu")(aux)
        aux = Dense(units=600, activation="relu")(aux)
        aux = Bidirectional(LSTM(units=400, return_sequences=True))(aux)
        aux = Dropout(rate=self.dropout_rate)(aux)
        aux = Dense(units=600, activation="relu")(aux)
        aux = Dense(units=600, activation="relu")(aux)
        aux = Dense(units=29, activation="sigmoid")(aux)


        ValueError: A 'Concatenate' layer require inputs with matching shapes except for the concat axis. Got inputs shapes: [(None, None, 18, 500), (None, None, 24)]

1 Ответ

0 голосов
/ 06 апреля 2020

Поскольку одношаговый вход содержит 18 входов для слоя внедрения, нам может потребоваться изменить форму вывода слоя внедрения, чтобы сгладить последние два измерения.

    # import Reshape layer
    from tf.keras.layers import Reshape

    inputs = Input(shape=(None, 18,), dtype=np.int16, name="Inp1")
    embbed_input = Embedding(input_dim=1, output_dim=500, input_length=18)
    aux = embbed_input(inputs)
    # Note: it is generally not a great idea to add dropout just after the embedding layer
    aux = Dropout(rate=self.dropout_rate)(aux)
    # before the concatenate layer, reshape it to (None, None, 500*18)
    aux = Reshape(target_shape=(-1,-1,500*18))(aux)
    inputs_feat = Input(shape=(None, 24,), dtype=np.float32, name="Inp2")
    aux = concatenate([aux, inputs_feat], axis=2) # no need to specify axis when it is the final dimension
    aux = Dense(units=600, activation="relu")(aux)
    aux = Dense(units=600, activation="relu")(aux)
    aux = Bidirectional(LSTM(units=400, return_sequences=True))(aux)
    aux = Dropout(rate=self.dropout_rate)(aux)
    aux = Dense(units=600, activation="relu")(aux)
    aux = Dense(units=600, activation="relu")(aux)
    aux = Dense(units=29, activation="sigmoid")(aux)
...