Sto*_*ney 4 python machine-learning time-series keras tensorflow
我有一个带有多个输入的预训练模型,这些输入具有不同的形状。所以我可以在具有匹配形状的新输入上调用模型,如下所示:
new_output = model([input_1, input2])
Run Code Online (Sandbox Code Playgroud)
和
input_1.shape = (400, 200)
input_2.shape = (400, 200, 10)
Run Code Online (Sandbox Code Playgroud)
我想重用该模型以在数据系列上对其进行训练,因此我的新输入将具有以下形状:
input_1.shape = (100, 400, 200)
input_2.shape = (100, 400, 200, 10)
Run Code Online (Sandbox Code Playgroud)
为了重用模型,我想像这样使用TimeDistributedKeras 中的层:
output = TimeDistributed(model)([input_1, input_2])
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为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)
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为它只在模型TimeDistributed上使用lambda_0而不是在模型上使用。也许有一个带有Lambda包装器的解决方案可以解决这个问题,或者我必须定义一个自定义的 Keras 层,但目前我遇到了这个问题,所以我很感激任何帮助。
你可以很容易重新塑造(?, 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])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1875 次 |
| 最近记录: |