我在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函数?(我没有找到)感谢您的关注! :)
答案 0 :(得分:1)
您可以尝试找到更好的替代方法。如果您指定shape=(None,None,3)
说3个通道的高度和宽度,那么CNN层可以处理任意形状。您可以像这样训练原始模型,而不必在预测时调整张量/图像形状。