Keras 加权合并

Keras weighted merge

我正在尝试使用 Keras 的 Merge 层计算多个并行模型的加权输出。我正在使用 Theano 后端。

我有 L 个并行模型 (Ci)。它们的每个输出层都是一个 k 大小的 softmax。

有一个模型(N),它的输出是一个L-sized 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 中执行矩阵代数。张量参数没有 "shape" 参数 - 它们有 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 并按以下方式使用它:

  1. 定义 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)
    
  2. 定义合并softmax:

    merge_softmax= Dense(L, activation='softmax', ...)(input_to_merge_softmax)
    merge_softmax = Reshape((1, L))(merge_softmax)
    
  3. 合并重塑L个模特的包包:

    bag_of_models = merge([softmax_1, ..., softmax_L], mode = 'concat')
    bag_of_models = Reshape((L, K))(bag_of_models)
    
  4. 计算最终合并的softmax:

    final_result = merge([bag_of_models, merge_softmax], mode = 'dot', dot_axes = [1, 2])
    final_result = Reshape((K, ))(final_result)
    

当然——取决于你的拓扑结构——不同的张量可能是相同的(例如输入到不同的 softmax)。我在我的机器上测试了这个但是由于大量的重构 - 我可能会犯错误 - 所以如果你找到一个 - 请通知我。

Sequential 的解决方案不太清楚,而且有点麻烦 - 但如果你想要一个 - 请写在评论中,以便我更新我的答案。