【问题标题】:Can I use loops inside a model using functional API?我可以使用函数式 API 在模型中使用循环吗?
【发布时间】:2019-08-09 10:20:45
【问题描述】:

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


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

【问题讨论】:

  • 请注意:如果您只想将[2,16] 展平为[2*16] 向量(即连接后的结果),您只需重塑输入
  • @GPhilo 实际上不清楚你在说什么。主模型的输入是 [2,16,],经过训练的模型采用 [2,] 的输入和大小 [8, ] 的输出。所以我将我的 [2,16] 输入分成 16 个切片,并在最后连接大小为 [8,] 的输出。 16 次迭代后,它会给出一个 [128, ] 的向量。我想添加另一个用 keras 编写的模块(不是 NN),它将大小为 128 的 x_output 作为输入和 128 的输出,用于计算我想要的损失函数。
  • 哦哦,这更有意义了,我知道您想重新排列您的数据以使其与第二个模型兼容。

标签: python machine-learning keras keras-layer


【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-31
    • 2018-06-28
    • 2018-02-28
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 2018-12-29
    相关资源
    最近更新 更多