我有一个预训练模型,其中包含多个具有不同形状的输入。因此,我可以在形状匹配的新输入上调用模型:
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层,但此刻我仍然遇到这个问题,希望能对您有所帮助。
答案 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])