加载不同于Keras培训输入尺寸的图像

时间:2018-04-22 03:17:48

标签: keras

我正致力于处理超分辨率的CNN。我需要从图像中提取补丁,然后训练这些小补丁(即41x41)。

然而,在预测图像时,图像的大小比贴片大。但是Keras不允许我预测比训练图像更大的图像。

我看过Can Keras deal with input images with different size?。我已尝试将None放入网络输入形状然后加载权重。但是,当谈到这一行:c1 = PReLU()(c1)时,我收到错误:nt() argument must be a string, a bytes-like object or a number, not 'NoneType'。代码紧扣在下面。

如何解决此问题?我正在使用带有张量流后端的Keras。我没有完全连接的图层,所有都是带有relu的Conv2D,除了下面的代码片段,它是针对c1的PReLU。

感谢。

input_shape = (None,None,1)
x = Input(shape = input_shape)
c1 = Convolution2D(64, (3,3), init = 'he_normal', padding='same', name='Conv1')(x)
c1 = PReLU()(c1)
#............................
output_img = keras.layers.add([x, finalconv])
model = Model(x, output_img)

1 个答案:

答案 0 :(得分:1)

  

Keras不允许我预测比尺寸更大的图像   训练图像

这是错误的,keras允许您在网络设计正确时执行此操作。

  

然而,当涉及到这一行:c1 = PReLU()(c1)时,我得到了   错误:nt()参数必须是字符串,类似字节的对象或   数字,而不是' NoneType'。

此错误是预期的,因为您的输入形状包含None。实际上,如果您之前为shared_axes=[1,2]设置PReLU(默认值shared_axes=None),则不会看到此错误。

因此,真正的问题是PReLU的参数,以前只为41x41输入设置,但现在要求它们适用于任意输入大小。

最佳解决方案是直接训练输入形状为(None,None,3)的新模型。

如果您不关心可能的降级,可以加载预训练模型的所有图层权重,PReLU图层除外。然后,可以在PReLU之间手动计算相应的shared_axes =[1,2]参数,并将其用作新的PReLU参数。