在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
,但我不知道出来。
答案 0 :(得分:2)
您可以重复元素,然后进行串联。
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)