如何在Keras中连接输入和矩阵

时间:2017-09-20 17:13:45

标签: python tensorflow keras

我正在Keras建立一个模型。我有一个输入

X = Input(shape=(input_size, ), name='input_feature')

和一个固定的预先给定的numpy矩阵D input_size n

我想在将它们输入到下一层之前连接X和D.换句话说,我需要连接X和D的每个切片以生成一个新的inpt,其预期大小应为(none, input_size, n+1)。那么我该怎么做才能将它们连接起来呢?根据我的理解,批量大小为none,因为当我们将数据拟合到模型时,它将适应输入X的批量大小。

1 个答案:

答案 0 :(得分:0)

回答D是否有形状(batch,input_size,n)

假设D是张量(如果它是某个层的输出则是张量):

X = Reshape((input_size,1))(X)
concat = Concatenate()([D,X])

如果D不是张量:

import keras.backend as K

#create a tensor:
Dval = K.variable(numpyArrayForD)

#create an input for D:
D = Input(tensor=Dval)

#do as in the top of this answer. 

如果你想避免额外的Input(由于tensor参数,它不会影响训练的方式),你可以使用lambda图层:

def concatenation(x):
    D = K.variable(D_df)

    return K.concatenate([x,D])

XD = Lambda(concatenation,output_shape=(input_size,n+1))(X)

如果D具有形状(input_size,n)

,则回答

在这种情况下,它可能会更好地复制D多次。您可以在创建K.variable之前使用numpy函数在模型外部执行此操作(请参阅其他答案),如下所示:

D_df = D_df.reshape((1,input_size,n))
D_df = numpy.repeat(D_df,batch,axis=0)

但是这种方法要求您事先适应x的大小。 如果你想要的东西适应任何尺寸的X而不必改变D,那么它就更复杂了....