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 并按以下方式使用它:
定义 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)
合并重塑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)
当然——取决于你的拓扑结构——不同的张量可能是相同的(例如输入到不同的 softmax)。我在我的机器上测试了这个但是由于大量的重构 - 我可能会犯错误 - 所以如果你找到一个 - 请通知我。
Sequential
的解决方案不太清楚,而且有点麻烦 - 但如果你想要一个 - 请写在评论中,以便我更新我的答案。
我正在尝试使用 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 并按以下方式使用它:
定义
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)
合并重塑
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)
当然——取决于你的拓扑结构——不同的张量可能是相同的(例如输入到不同的 softmax)。我在我的机器上测试了这个但是由于大量的重构 - 我可能会犯错误 - 所以如果你找到一个 - 请通知我。
Sequential
的解决方案不太清楚,而且有点麻烦 - 但如果你想要一个 - 请写在评论中,以便我更新我的答案。