【发布时间】:2017-06-04 22:54:21
【问题描述】:
我正在尝试使用 Keras 的 Merge 层计算来自多个并行模型的加权输出。我正在使用Theano 后端。
我有L 并行模型(Ci)。它们的每个输出层都是一个 k 大小的 softmax。
有一个模型(N),它的输出是一个L大小的softmax。
这是我目前所拥有的:
并行模型(Ci)每个在输出层都有k维:
model.add(Dense(K, activation='softmax', W_regularizer=l2(0.001),init='normal'))
称重模型(N),输出层:
model.add(Dense(L, activation='softmax', W_regularizer=l2(0.001), init='normal'))
合并如下:
model.add(Merge(layers=model_group,
mode=lambda model_group: self.merge_fun(model_group, L),
output_shape = (None, k)))
其中“model_group”是一个 (L+1) 长度的列表 [N, C1, C2, ..., CL],merge_fun 的签名是:
def merge_fun(self, model_group, L):
在数学上,我希望合并层的输出是一个加权和:
out = N[1]x([C11, C12, C13, .., C1k]) + N[2]x([C21, C22, C23, ..., C2k]) + . .. + N[L]x([CL1, CL2, CL3, ..., CLk]),
其中out是大小为k的向量
如何使用合并层来实现这一点?
我知道魔法可能必须在“merge_fun”中发生,但我不确定如何在 Keras 中执行矩阵代数。张量参数没有“形状”参数——它们有一个keras_shape = (None, K or L)——但我不确定如何将并行模型的输出组合成一个矩阵。
我尝试使用以下表达式的本地评估:
K.concatenate([model_group[1], model_group[2]], axis=0)*model_group[0]
和
model_group[0] * K.concatenate([model_group[1], model_group[2]], axis=0)
两者都没有抛出错误,所以我不能以此为指导。相乘后返回的结果没有keras_shape这个变量,所以我不确定结果的形状是什么。
有什么建议吗?
【问题讨论】:
-
这里有一种操作可学习加权平均值的简单方法:stackoverflow.com/questions/62595660/…
标签: machine-learning merge neural-network theano keras