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

2024-10-01 13:32:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个训练有素的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)


虽然保存的模型给了我很好的性能,但是这个代码没有很好的训练,也没有达到预期的性能。 我能做些什么来获得更好的结果?你知道吗


Tags: lambda代码模型inputoutputmodellayerstf
1条回答
网友
1楼 · 发布于 2024-10-01 13:32:55

我不能说你的最终模型有什么不好的表现,因为这可能是由于各种原因造成的,而这从你的问题的内容来看并不明显。但要回答您最初的问题:是的,您可以这样使用for循环,因为您实际上是在创建层/张量并将它们相互连接(即构建模型的图形)。所以这是一个有效的做法。问题可能在其他地方,例如错误的索引、错误的损失函数等

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

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

相关问题 更多 >