代码之家  ›  专栏  ›  技术社区  ›  sebrockm

如何在keras中将一行和一列特征成对地组合成一个特征矩阵?

  •  1
  • sebrockm  · 技术社区  · 6 年前

    在keras中,使用函数API,我有两个独立的层(张量)。第一个是特征列表的行向量,另一个是特征列表的列向量。为简单起见,假设它们是这样创建的:

    rows = 5
    cols = 10
    features = 2
    
    row = Input((1, cols, features))
    col = Input((rows, 1, features))
    

    现在我想“合并”这两个层,结果是一个5行10列的矩阵(基本上是一个 5x1 通过 1x10 矩阵乘法),其中该矩阵的每个条目是行和列向量的每个可能组合的串联特征列表。 MergeLayer 这将结合我的 row col 将层添加到 matrix (rows, cols, 2*features) :

    matrix = MergeLayer()([row, col]) # output_shape of matrix shall be (rows, cols, 2*features)
    

    例如 cols = rows = 2 :

    row = [[[1,2]], [[3,4]]]
    col = [[[5,6],
            [7,8]]]
    
    matrix = [[[1,2,5,6], [3,4,5,6]],
              [[1,2,7,8], [3,4,7,8]]]
    

    Dot Reshape 和/或 Permute ,但我想不通。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Kota Mori    6 年前

    可以重复元素,然后连接。

    from keras.layers import Input, Lambda, Concatenate
    from keras.models import Model
    import keras.backend as K
    
    rows = 2
    cols = 2
    features = 2
    
    row = Input((1, cols, features))
    col = Input((rows, 1, features))
    
    row_repeated = Lambda(lambda x: K.repeat_elements(x, rows, axis=1))(row)
    col_repeated = Lambda(lambda x: K.repeat_elements(x, cols, axis=2))(col)
    out = Concatenate()([row_repeated, col_repeated])
    
    model = Model(inputs=[row,col], outputs=out)
    model.summary()
    

    实验:

    import numpy as np
    
    x = np.array([1,2,3,4]).reshape((1, 1, 2, 2))
    y = np.array([5,6,7,8]).reshape((1, 2, 1, 2))
    model.predict([x, y])
    
    #array([[[[1., 2., 5., 6.],
    #         [3., 4., 5., 6.]],
    #
    #        [[1., 2., 7., 8.],
    #         [3., 4., 7., 8.]]]], dtype=float32)