Warm tip: This article is reproduced from serverfault.com, please click

python-临时合并Keras中的批次尺寸

(python - Temporarily merge the batch dimension in Keras)

发布于 2020-11-28 13:43:05

我有一个Keras模型,输入形状为[None, 500, 500, 3],输出形状为[None, 1]现在,我想制作一个包装模型,其输入形状为[None, 48, 500, 500, 3],输出形状为[None, 48]

为此,幼稚的方法是在第二个轴上迭代48次并应用第一个模型,然后使用KerasConcatenate层获得所需的形状。

model_outputs = []
for i in range(inputs.shape[1]):
    im_block = inputs[:, i]
    model_outputs += [self.model(im_block)]
return Concatenate()(model_outputs)

但是,这使图形变得相当复杂。因此,我想改为执行以下操作:

        [None, 48, 500, 500, 3]
     -> [None*48,  500, 500, 3]
           (apply the model)
     -> [None*48,  1]
     -> [None, 48, 1]

我的尝试是

outputs = tf.reshape(inputs, (inputs[0] * inputs[1], *inputs[2:]))
outputs = self.model(outputs)
outputs = tf.reshape(outputs, (inputs[0], inputs[1]))
return outputs

但这给了我

TypeError: Cannot iterate over a tensor with unknown first dimension.

有没有办法做到这一点 ?

Questioner
Samuel Prevost
Viewed
11
Andrey 2020-11-29 01:29:39

这应该工作:

inp = tf.reshape(inp, (-1, 500, 500, 3))
res = model(inp)
res = tf.reshape(res, (-1, 48))