Keras:替换模型的输入层不会更新模型,摘要等其他层的输出形状

时间:2018-09-06 11:26:27

标签: python tensorflow keras

我在TensorFlow后端上使用Keras。我想使用预训练的U-Net模型,并用另一个模型替换输入层。 我在尺寸(256,256)的图像上训练了模型。当我预测更大的场景时,我想操纵输入,以便UNet可以完成它的工作,只是在另一个图像尺寸上,这样我就不必对图像进行可爱处理。这是我的代码:

model = load(model_path)
model.layers.pop(0)
new_input = Input(shape = (512,512))
model = Model(new_input,model(new_input_layer))

现在使用时

print(model.summary())

它输出

_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
input_1 (InputLayer)         (None, 512, 512, 3)     0
_________________________________________________________________
model_1 (Model)              multiple                  211825
=================================================================

如果我在做

model.layers[1].summary()

我知道

____________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connectedto
=========================================================================
conv2d_1 (Conv2D)             (None, 256, 256, 16)    1216     input_1[0][0]
__________________________________________________________________________
batch_normalization_1       (None, 256, 256, 16)      64      conv2d_1[0][0]

,依此类推。通常, conv_2d_1 的输出形状应为(None,512,512,16),但未正确更新(其他层也未正确更新)。此外,当我使用

model.layers[1].layers[0].output_shape

我得到与摘要相同的结果。

当我使用调整后的模型进行预测时,就输出而言一切正常。但是,如果图像大小大于(512,512),例如(4096,4096),我会遇到有关gpu的内存问题/分配问题。 因此,我想计算所需的内存,以预测图像并将其剪切(如果太大)。但是要编写一个对我有用的函数,我需要有关输出形状的正确信息。
有没有人有什么建议?也许我应该以另一种方式替换输入层?也许我可以以某种方式更新模型? 还是已经存在一些计算所需内存的keras函数?(我没有找到)感谢您的关注! :)

1 个答案:

答案 0 :(得分:1)

您可以尝试找到更好的替代方法。如果您指定shape=(None,None,3)说3个通道的高度和宽度,那么CNN层可以处理任意形状。您可以像这样训练原始模型,而不必在预测时调整张量/图像形状。