我正在研究一个深度学习模型,试图将两个不同模型的输出结合起来:
整体结构如下:
所以第一个模型接受一个矩阵,例如 [10 x 30]
#input 1input_text = layers.Input(shape=(1,), dtype="string")embedding = ElmoEmbeddingLayer()(input_text)model_a = Model(inputs = [input_text] , outputs=embedding) # shape : [10,50]
现在第二个模型接受两个输入矩阵:
X_in = layers.Input(tensor=K.variable(np.random.uniform(0,9,[10,32])))M_in = layers.Input(tensor=K.variable(np.random.uniform(1,-1,[10,10]))md_1 = New_model()([X_in, M_in]) #new_model defined somewheremodel_s = Model(inputs = [X_in, A_in], outputs = md_1) # shape : [10,50]
我想让这些矩阵可以被训练,就像在TensorFlow中我可以通过以下方式做到这样:
matrix_a = tf.get_variable(name='matrix_a', shape=[10,10], dtype=tf.float32, initializer=tf.constant_initializer(np.array(matrix_a)),trainable=True)
我不知道如何让matrix_a和matrix_b可以被训练,以及如何合并这两个网络的输出然后输入。
我查看了这个问题,但没有找到答案,因为他们的问题陈述与我的不同。
到目前为止,我尝试过的是:
#input 1input_text = layers.Input(shape=(1,), dtype="string")embedding = ElmoEmbeddingLayer()(input_text)model_a = Model(inputs = [input_text] , outputs=embedding) # shape : [10,50]X_in = layers.Input(tensor=K.variable(np.random.uniform(0,9,[10,10])))M_in = layers.Input(tensor=K.variable(np.random.uniform(1,-1,[10,100]))md_1 = New_model()([X_in, M_in]) #new_model defined somewheremodel_s = Model(inputs = [X_in, A_in], outputs = md_1) # [10,50]#tranpose second model outputtranpose = Lambda(lambda x: K.transpose(x))agglayer = tranpose(md_1)# concat first and second model outputdott = Lambda(lambda x: K.dot(x[0],x[1]))kmean_layer = dotter([embedding,agglayer])# input final_model = Model(inputs=[input_text, X_in, M_in], outputs=kmean_layer,name='Final_output')final_model.compile(loss = 'categorical_crossentropy', optimizer='adam', metrics=['accuracy'])final_model.summary()
模型概览:
更新:
模型 B
X = np.random.uniform(0,9,[10,32])M = np.random.uniform(1,-1,[10,10])X_in = layers.Input(tensor=K.variable(X))M_in = layers.Input(tensor=K.variable(M))layer_one = Model_b()([M_in, X_in])dropout2 = Dropout(dropout_rate)(layer_one)layer_two = Model_b()([layer_one, X_in])model_b_ = Model([X_in, M_in], layer_two, name='model_b')
模型 A
length = 150dic_size = 100embed_size = 12input_text = Input(shape=(length,))embedding = Embedding(dic_size, embed_size)(input_text)embedding = LSTM(5)(embedding) embedding = Dense(10)(embedding)model_a = Model(input_text, embedding, name = 'model_a')
我像这样合并:
mult = Lambda(lambda x: tf.matmul(x[0], x[1], transpose_b=True))([embedding, model_b_.output])final_model = Model(inputs=[model_b_.input[0],model_b_.input[1],model_a.input], outputs=mult)
这种方式可以正确地将两个Keras模型进行矩阵乘法吗?
我不知道我是否正确地合并了输出,以及模型是否正确。
如果有人能友好地给我一些建议,告诉我如何使那个矩阵可训练,以及如何正确地合并模型的输出然后输入,我将非常感激。
提前感谢!
回答: