Keras Time分布有多个不同形状的输入

时间:2018-10-08 09:48:35

标签: python tensorflow machine-learning keras time-series

我有一个预训练模型,其中包含多个具有不同形状的输入。因此,我可以在形状匹配的新输入上调用模型:

new_output = model([input_1, input2])

input_1.shape = (400, 200)
input_2.shape = (400, 200, 10)

我想重用该模型以对数据序列进行训练,因此我的新输入将具有以下形状:

input_1.shape = (100, 400, 200)
input_2.shape = (100, 400, 200, 10)

要重用模型,我想像这样使用Keras的TimeDistributed层:

output = TimeDistributed(model)([input_1, input_2])

这不起作用,因为TimeDistributed不接受列表作为输入。到目前为止,我发现所有变通办法都是使用合并的输入来解决此问题,但由于输入形状不同,因此在我的情况下该解决方案不起作用。

我还尝试使用一些Lambda层,例如:

lambda_0 = Lambda(lambda x: x)
lambda_1 = Lambda(lambda x: [TimeDistributed(lambda_0)(x[0]), TimeDistributed(lambda_0)(x[1])])([input_1, input_2])
output = model(lambda_1)

但是这不起作用,因为它仅在TimeDistributed上使用lambda_0,而不在模型上使用。也许有一个Lambda包装器可以解决此问题,或者我必须定义一个自定义Keras层,但此刻我仍然遇到这个问题,希望能对您有所帮助。

1 个答案:

答案 0 :(得分:2)

您可以轻松地将(?, 400, 200)重塑为(?, 400, 200, 1),然后将两个输入连接起来,形成具有(?, 400, 200, 11)形状的张量,然后将该张量馈送到Lambda层,即包裹在TimeDistributed层中,因此在每个时间步上应用模型:

in1 = Input((400, 200))
in2 = Input((400, 200, 10))

r_in1 = Reshape((400, 200, 1))(in1) # you can also use `K.expand_dims()` in a Lambda layer
concat = concatenate([r_in1, in2])

out_model = TimeDistributed(Lambda(lambda x: model([x[:,:,0], x[:,:,1:]])))(concat)

new_model = Model([in1, in2], [out_model])