【问题标题】:Keras TimeDistributed with multiple Inputs in different shapesKeras TimeDistributed,具有不同形状的多个输入
【发布时间】:2018-10-08 09:48:34
【问题描述】:

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

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)

但这不起作用,因为它只在lambda_0 上使用TimeDistributed,而不是在模型上。也许有Lambda wrappers 的解决方案可以解决这个问题,或者我必须定义一个自定义的 Keras 层,但目前我遇到了这个问题,所以我将不胜感激。

【问题讨论】:

  • 你的初始模型有一个输出层吗?
  • 是的,输入在模型内部连接并产生一个输出。

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


【解决方案1】:

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

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])

【讨论】:

  • 此解决方案有效。就我而言,我必须在再次拆分图层后调整图层的形状。只是告诉你,以防有人遇到同样的问题;)谢谢你的帮助。
  • 我在使用这种方法后遇到了形状问题。 @Stoney 你是什么意思你必须调整图层的形状?
  • @SebiSebi 如果不查看您的代码,很难理解问题所在。请提出一个新问题,提供足够的详细信息(即您的代码、您的期望、完整的错误日志等)。那么人们肯定可以更好地帮助你。
猜你喜欢
  • 2019-03-28
  • 2017-11-03
  • 2023-02-09
  • 1970-01-01
  • 1970-01-01
  • 2018-04-04
  • 1970-01-01
  • 2019-09-07
  • 2021-07-20
相关资源
最近更新 更多