我想把两个模特连在一起。我有一个伯特模型和一个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跟踪(最近一次调用)在9个输出= layers.Dense(2,activation='softmax',name =‘real_output’)(密度) 10 - 11 model_Multimodal = keras.models.Model(inputs=input_text,input_img,outputs=outputs)
包装器中的~/anaconda3/lib/python3.7/site-packages/keras/legacy/interfaces.py (*args,**kwargs) 89 warnings.warn(‘更新您的' + object_name + '调用到’+ 90‘Keras2API:’+签名,stacklevel=2‘)- call 91返回函数(*args,**kwargs) 92 wrapper._original_function = func 93返回包装器
~/anaconda3/lib/python3.7/site-packages/keras/engine/network.py in init(self,*args,** kwargs ) 92‘输入’在kwargs中,'outputs‘在kwargs中):93 #图形网络-> 94 self._init_graph_network(*args,**kwargs) 95个其他: 96 #子类网络
~/anaconda3/lib/python3.7/site-packages/keras/engine/network.py in _init_graph_network(self,inputs,outputs,name,**kwargs) 167‘必须来自keras.layers.Input。‘168’接收到:‘+ str(x) +- 169’(缺少前一层元数据)。) 170 #检查x是输入张量.171Layer,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).发布于 2020-04-23 21:22:40
在不知道用于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中提取出来的。
有关我的笔记本,请参阅这个储存库,探索这种图像标题的方法。
https://stackoverflow.com/questions/60368885
复制相似问题