我正致力于处理超分辨率的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)
答案 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
参数。