我可以使用函数 API 在模型中使用循环吗?

Can I use loops inside a model using functional API?

我有一个经过训练的 keras 模型,它接受大小为 (batchSize,2) 的输入。这很好用并产生了很好的结果。

我的主要问题是拥有一个模型,该模型接受一个大小为 (batchSize,2,16) 的输入向量,并将其在模型内部切成 16 个大小为 (batchSize,2) 的向量,并将输出连接在一起。

我为此使用了此代码

    y = layers.Input(shape=(2,16,))

    model_x= load_model('saved_model')

    for i in range(16):
        x_input = Lambda(lambda x: x[:, :, i])(y)

        if i == 0:
           x_output = model_x(x_input)
        else:
            x_output = layers.concatenate([x_output, 
                                      model_x(x_input)])

    x_output = Lambda(lambda x: x[:, :tf.cast(N, tf.int32)])(x_output)

    final_model = Model(y, x_output)


虽然保存的模型给我很好的性能,但这段代码训练得不好,没有达到预期的性能。 我该怎么做才能获得更好的结果?

我不能说你最终模型的糟糕表现,因为这可能是由于各种原因造成的,而这从你的问题内容中并不容易看出。但要回答您最初的问题:是的,您可以那样使用 for 循环,因为您实际上是在创建 layers/tensors 并将它们相互连接(即构建模型图)。所以这是一件有效的事情。问题可能出在其他地方,例如错误的索引、错误的损失函数等

此外,您可以用更简单的方法构建最终模型。您已经有一个训练有素的模型,它获取形状 (batch_size, 2) 的输入并给出形状 (batch_size, 8) 的输出。现在您想要构建一个接受形状 (batch_size, 2, 16) 输入的模型,将已训练的模型应用于 16 个 (batch_size, 2) 段中的每一个,然后连接结果。您可以使用 TimeDistributed 包装器轻松做到这一点:

# load your already trained model
model_x = load_model('saved_model')

inp = layers.Input(shape=(2,16))
# this makes the input shape as `(16,2)`
x = layers.Permute((2,1))(inp)
# this would apply `model_x` on each of the 16 segments; the output shape would be (None, 16, 8)
x = layers.TimeDistributed(model_x)(x)
# flatten to make it have a shape of (None, 128)
out = layers.Flatten()(x)

final_model = Model(inp, out)