【问题标题】:Loading image with different input size than training in Keras加载与在 Keras 中训练不同的输入大小的图像
【发布时间】:2018-10-02 09:11:45
【问题描述】:

我正在开发一个处理超分辨率的 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'。代码附在下面。

我该如何解决这个问题?我正在使用带有 tensorflow 后端的 Keras。我没有全连接层,都是带relu的Conv2D,除了下面的sn-p,是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)

【问题讨论】:

    标签: keras


    【解决方案1】:

    Keras 不允许我预测尺寸大于 训练图像

    这是错误的,keras 允许您在网络设计正确时这样做。

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

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

    因此,这里真正的问题是 PReLU 的参数,以前只为 41x41 输入设置,但现在被要求为任意输入大小工作。

    最好的解决方案是直接训练一个输入 shape = (None,None,3) 的新模型。

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

    【讨论】:

    • 嗨,@user36624。感谢您的回答。嗨,所以如果我保持输入形状为 (41,41,1),但更改 PReLU 输入参数,即input_shape = (41,41,1)c1 = PReLU(shared_axes = [1,2])(c1),并重新训练网络,可以吗?
    • 你留input_shape=(None,None,1)应该没问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-05
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    相关资源
    最近更新 更多