gpt4 book ai didi

python - 具有不同形状的多个输入的 Keras TimeDistributed

转载 作者:太空宇宙 更新时间:2023-11-03 15:40:28 25 4
gpt4 key购买 nike

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

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 包装器的解决方案,或者我可能必须定义一个自定义 Keras 层,但目前我遇到了这个问题,所以我将不胜感激。

最佳答案

您可以轻松地将 (?, 400, 200) reshape 为 (?, 400, 200, 1),然后将两个输入连接起来以获得形状为 Tensor (?, 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])

关于python - 具有不同形状的多个输入的 Keras TimeDistributed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52699598/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com