连接BERT和CNN

问题描述 投票:0回答:1

我想把两个模型合并成一个,我有一个BERT模型和EfficientNet模型。

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 (最近一次调用) in 9 outputs = layers.Dense(2, activation='softmax', name = 'real_output')(dense) 10 ---> 11 model_Multimodal = keras.models.Model(input=[input_text, input_img], outputs=outputs)

~anaconda3libpython3.7site-packageskeraslegacyinterfaces.py in wrapper(*args, **kwargs) 89 warnings.warning('更新你的 ' + object_name + ' 调用 '+90 'Keras 2 API: '+ signature, stacklevel=2)---> 91 return func(*args, **kwargs) 92 wrapper._original_function = func 93 return wrapper.

~anaconda3libpython3.7site-packageskerasenginenetwork.py在 启动(self, *args, **kwargs) 92 'input' in kwargs and 'output' in kwargs): 93 # 图形网络---> 94 self._init_graph_network(*args, **kwargs) 95 else: 96 # 子类网络

~anaconda3libpython3.7site-packageskerasenginenetwork.py中 _init_graph_network(self, inputs, outputs, name, **kwargs) 167 '必须从 keras.layers.Input. ' 168 '收到。' + str(x) +--> 169 ' (缺少前一层元数据).') 170 # 检查x是否是一个输入张量. 171 layer, node_index, tensor_index = 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).
python tensorflow keras deep-learning keras-layer
1个回答
0
投票

在不知道你的代码中,很难判断出你使用的是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 已通过tokenizer和 img_embeddings 是从一个预先训练好的CNN中提取出来的。

本库 为我的笔记本探索这种图像标题的方法。

© www.soinside.com 2019 - 2024. All rights reserved.