【问题标题】:Keras weighted mergeKeras 加权合并
【发布时间】: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这个变量,所以我不确定结果的形状是什么。

有什么建议吗?

【问题讨论】:

标签: machine-learning merge neural-network theano keras


【解决方案1】:

我建议您使用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 的解决方案不太清晰而且有点麻烦 - 但如果你想要一个 - 请在评论中写下,以便我更新我的答案。

【讨论】:

  • 感谢 Marcin 的反馈。我还没有机会研究它。我会更新(希望很快)反馈。
  • 好的,抱歉耽搁了。所以在我构建了合并(顺序)模型之后,我直接(通过名称)访问输出层。这对应于您的“merge_softmax”。我确认它是“密集”类型。但是当我调用 reshape 时:Reshape((1, L))(merge_outlayer),我得到一个“不是 Keras 张量”。我在这里缺少一个选项吗?
  • 只是为了澄清:N-被构建为它自己的(顺序)模型。并且每个 Ci 都是作为它们各自的(顺序)模型构建的。以防万一跨模型实例访问和合并图层很重要
  • 看来你的方法可行,但做了一些修改:合并Ci's后,我不得不将它们包装成Input()。同样在“点”乘法之后,我不得不将张量重新包装在输入中 - 使用功能符号final_result = Input(tensor=Reshape((num_classes,))(final_result))。形状输出与预期一致,模型运行(损失有所减少..)。但是现在我保存模型后,我无法再次加载它。
猜你喜欢
  • 2017-11-26
  • 2020-09-29
  • 1970-01-01
  • 1970-01-01
  • 2019-07-25
  • 2017-07-27
  • 2020-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多