我可以使用功能性API在模型内部使用循环吗?

时间:2019-08-09 10:20:45

标签: python machine-learning keras keras-layer

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


尽管保存的模型为我提供了良好的性能,但是此代码不能很好地训练并且没有提供预期的性能。 我该怎么做才能获得更好的结果?

1 个答案:

答案 0 :(得分:1)

对于您的最终模型的不良表现,我无话可说,因为这可能是由于各种原因造成的,而从您的问题的内容中并不能很明显地看出这一点。但是要回答您的原始问题:是的,您可以使用for循环,因为实际上是在创建层/张量并将它们彼此连接(即,构建模型图)。所以这是一件有效的事情。问题可能出在其他地方,例如错误的索引编制,错误的损失函数等。

此外,您可以用一种更简单的方法来构建最终模型。您已经有一个训练有素的模型,该模型获取形状为(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)