machine-learning - Keras 加权合并

标签 machine-learning merge neural-network theano keras

我正在尝试使用 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并按以下方式使用它:

  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. 合并并 reshape 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)
    

当然 - 根据您的拓扑 - 不同的张量可能是相同的(例如输入到不同的 softmaxes)。我在我的机器上测试了这个,但由于广泛的重构 - 我可能会犯错误 - 所以如果你找到一个 - 请通知我。

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

关于machine-learning - Keras 加权合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41755383/

相关文章:

matlab - 使用图像处理进行秃头检测

php - 按共享列值合并两个二维数组

sql - 当使用多个 WHEN MATCHED 语句时,它们是全部执行,还是只执行一个?

python - 格式化图像数据以预测 MNIST 数据模型图像中的数字

python - 计算卷积神经网络中特征图的维度

R 深网包 : how to add more hidden layers to my neural network?

python-2.7 - 如何在keras中以百分比形式显示预测结果?

python - 如何将 predict_generator 与 ImageDataGenerator 一起使用?

tensorflow - 多类 sparse_categorical_crossentropy TruePositives metric 不兼容的形状 : [2, 128] vs. [2,64]

r - 在 R 的数据框中合并两个列表