我正在尝试使用 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 变量,所以我不确定结果的形状是什么。
有什么建议吗?
最佳答案
我建议您使用functional API并按以下方式使用它:
定义
L
输出模型:softmax_1 = Dense(K, activation='softmax', ...))(input_to_softmax_1) softmax_2 = Dense(K, activation='softmax', ...))(input_to_softmax_2) ... softmax_L = Dense(K, activation='softmax', ...))(input_to_softmax_L)
定义合并softmax:
merge_softmax= Dense(L, activation='softmax', ...)(input_to_merge_softmax) merge_softmax = Reshape((1, L))(merge_softmax)
合并并 reshape
L
模型包:bag_of_models = merge([softmax_1, ..., softmax_L], mode = 'concat') bag_of_models = Reshape((L, K))(bag_of_models)
计算最终合并的 softmax:
final_result = merge([bag_of_models, merge_softmax], mode = 'dot', dot_axes = [1, 2]) final_result = Reshape((K, ))(final_result)
当然 - 根据您的拓扑 - 不同的张量可能是相同的(例如输入到不同的 softmaxes)。我在我的机器上测试了这个,但由于广泛的重构 - 我可能会犯错误 - 所以如果你找到一个 - 请通知我。
使用Sequential
的解决方案不太清晰,而且有点麻烦 - 但如果你想要一个 - 请在评论中写下,以便我更新我的答案。
关于machine-learning - Keras 加权合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41755383/