Объединить BERT и CNN - PullRequest
       32

Объединить BERT и CNN

0 голосов
/ 24 февраля 2020

Я пытаюсь объединить две модели в одну. У меня есть модель BERT и модель Efficien tNet.

input_text = model_Bert.inputs[:2]
text = model_Bert(input_text)
input_img = model_EfNet.layers[0].input
img = model_EfNet(input_img)
concatenated = layers.concatenate([text, img], axis=1) #same dimension
dense = layers.Dense(512, activation='relu')(concatenated)
dense = layers.Dense(128, activation='relu')(dense)
dense = layers.Dropout(0.3)(dense)
outputs = layers.Dense(2, activation='softmax', name = 'real_output')(dense)

model_Multimodal = keras.models.Model(inputs=[input_text, input_img], outputs=outputs)

Но я получил эту ошибку:


ValueError Traceback (последний последний вызов) в 9 выходных данных = слоях. Плотный (2, активация = 'softmax', имя = 'real_output') (плотный) 10 ---> 11 model_Multimodal = keras.models.Model (входные данные = [input_text, input_img], выходные данные = выходные данные)

~ / anaconda3 / lib / python3 .7 / site-packages / keras / legacy / interfaces.py в оболочке (* args, ** kwargs) 89 warnings.warn ('Обновите ваш ' + object_name + ' вызов на' + 90 'Keras 2 API:' + сигнатура, уровень стека = 2) ---> 91 возвращение удовольствия c (* args, ** kwargs) 92 wrapper._original_function = func 93 возвращение оболочки

~ / anaconda3 /lib/python3.7/site-packages/keras/engine/network.py в init (self, * args, ** kwargs) 92 'входы' в kwargs и 'выходы' в kwargs ): 93 # Сеть графов ---> 94 self._init_graph_network (* args, ** kwargs) 95 else: 96 # Сеть подклассов

~ / anaconda3 / lib / python3 .7 / site-packages /keras/engine/network.py в _init_graph_network (s) эльф, входы, выходы, имя, ** kwargs) 167 'должно быть от keras.layers.Input. '168' Получено: '+ str (x) + -> 169' (отсутствует метаданные предыдущего слоя). ') 170 # Проверьте, что x является входным тензором. 171 слой, индекс_узла, тензор_индекс = x._keras_history

ValueError: Input tensors to a Model must come from `keras.layers.Input`. Received: [<tf.Tensor 'Input-Token_1:0' shape=(None, 128) dtype=float32>, <tf.Tensor 'Input-Segment_1:0' shape=(None, 128) dtype=float32>] (missing previous layer metadata).

1 Ответ

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

Трудно отличить ваш код, не зная реализации, которую вы используете для BERT. В частности, это безголовая модель? Насколько я понимаю (что может быть неверно), BERT без головы обеспечивает вывод в форме (batch_size, seq_length, embedding_dim). Другими словами, форма вывода является переменной с размером ввода. Таким образом, я не вижу, как ваше вложение изображения всегда будет иметь ту же форму, что и выходные данные вашего преобразователя.

Я использую библиотеку transformers и предварительно обучил CNN создавать бимодальную модель языка примерно следующим образом:

def call(encoded_sentences, img_embeddings, **transformer_kwargs):

        outputs = transformer(encoded_sentences, **transformer_kwargs)
        last_hidden_state, *_ = outputs
        batch_size, batch_seq_len, last_hidden_dim = last_hidden_state.shape

        # reshape and repeat image embeddings
        batch_size, *img_emb_shape = img_embeddings.shape
        img_emb_flattened = tf.reshape(img_embeddings, 
                                       (batch_size, np.prod(img_emb_shape)))
        emb_flattened_reps = tf.repeat(tf.expand_dims(img_emb_flattened, 1), 
                                       batch_seq_len, axis=1)

        # concatenate the language and image embeddings
        embs_concat = tf.concat([last_hidden_state, emb_flattened_reps], 2)

        # generate mlm predictions over input sequence
        training = transformer_kwargs.get('training', False)
        prediction_scores = mlm_head(embs_concat, training=training)

        # Add hidden states and attention if they are here
        outputs = (prediction_scores,) + outputs[2:]

        return outputs

Где в моем случае transformer - это TFAlbertModel, mlm_head - это TFAlbertMLMHead (если этот код кажется немного сбивает с толку, потому что я адаптировал его из метода класса в tf.keras.Model). Кроме того, имейте в виду, что encoded_sentences были пропущены через токенизатор, а img_embeddings извлечены из предварительно обученного CNN.

См. этот репозиторий для моего ноутбука, исследующего этот метод для субтитров изображения.

...