逐块在较大的输入上应用 tensorflow 模型

Applying tensorflow model on larger inputs block by block

提问人:DAF 提问时间:11/17/2023 更新时间:11/17/2023 访问量:24

问:

这是该问题的简化版本: 我有一个tf.keras模型,它接受形状为(5,3)的输入并产生(5,1)的输出。我想将其应用于形状为 (10,3) 的数据,并通过将模型应用于 5 行的连续块来获得输出为 (10,1)。有没有有效的方法?

我尝试将模型包装在重塑层中,例如:

original_model = tf.keras.Sequential([
    tf.keras.layers.Input((5, 3), name='inputs'),
    tf.keras.layers.Conv1D(8, kernel_size=1, padding='valid'),
    tf.keras.layers.Dense(units=1)
])


l1 = tf.keras.layers.Input((10, 3), name='inputs2')
l2 = tf.keras.layers.Reshape((2, 5, 3))(l1)
l3 = original_model(l2)
l4 = tf.keras.layers.Reshape((10, 1), input_shape=(2, 5, 1))(l3)

new_model = tf.keras.Model(
            inputs=l1,
            outputs=l4)

但这会引入额外的维度并导致错误:

ValueError:调用图层“model_4”时遇到异常 (键入“功能”)。
图层“sequential_9”的输入 0 与图层不兼容:预期 shape=(None, 5, 3), found shape=(None, 2, 5, 3)

蟒蛇 tensorflow tf.keras

评论

0赞 Nicolas Gervais 11/17/2023
这完全取决于你为什么想要不同的形状。你不妨使用tf.keras.layers.GlobalAveragePooling1D
0赞 DAF 11/18/2023
@NicolasGervais,如问题所述,我想要一个不同的形状来应用(任意)现有模型。我看不出池化对此有什么帮助,除非 max/avg 是所需要的。

答:

0赞 DAF 11/17/2023 #1

事实证明,有一个简单的解决方案 - 使用 tensorflow tf.space_to_batchtf.batch_to_space 而不是 Reshape 可以解决问题:

        l1 = tf.keras.layers.Input((10, 3), name='inputs')
        l2 = tf.keras.layers.Lambda(lambda x: tf.space_to_batch(x, [2, 1], [[0, 0], [0, 0]]))(l1)
        l3 = original_model(l2)
        l4 = tf.keras.layers.Lambda(lambda x: tf.batch_to_space(x, [2, 1], [[0, 0], [0, 0]]))(l3)