提问人:DAF 提问时间:11/17/2023 更新时间:11/17/2023 访问量:24
逐块在较大的输入上应用 tensorflow 模型
Applying tensorflow model on larger inputs block by block
问:
这是该问题的简化版本: 我有一个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)
答:
0赞
DAF
11/17/2023
#1
事实证明,有一个简单的解决方案 - 使用 tensorflow tf.space_to_batch 和 tf.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)
评论
tf.keras.layers.GlobalAveragePooling1D