Keras中的Segnet:新阵列的总大小必须保持不变错误 [英] Segnet in Keras: total size of new array must be unchanged error

查看:102
本文介绍了Keras中的Segnet:新阵列的总大小必须保持不变错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在用Python实现Segnet.以下是代码.

I am implementing Segnet in Python. Following is the code.

img_w = 480
img_h = 360
pool_size = 2

def build_model(img_w, img_h, pool_size):
    n_labels = 12

    kernel = 3

    encoding_layers = [
        Conv2D(64, (kernel, kernel), input_shape=(img_h, img_w, 3), padding='same'),
        BatchNormalization(),
        Activation('relu'),
        Convolution2D(64, (kernel, kernel), padding='same'),
        BatchNormalization(),
        Activation('relu'),
        MaxPooling2D(pool_size = (pool_size,pool_size)),

        Convolution2D(128, (kernel, kernel), padding='same'),
        BatchNormalization(),
        Activation('relu'),
        Convolution2D(128, (kernel, kernel), padding='same'),
        BatchNormalization(),
        Activation('relu'),
        MaxPooling2D(pool_size = (pool_size,pool_size)),

        Convolution2D(256, (kernel, kernel), padding='same'),
        BatchNormalization(),
        Activation('relu'),
        Convolution2D(256, (kernel, kernel), padding='same'),
        BatchNormalization(),
        Activation('relu'),
        Convolution2D(256, (kernel, kernel), padding='same'),
        BatchNormalization(),
        Activation('relu'),
        MaxPooling2D(pool_size = (pool_size,pool_size)),

        Convolution2D(512, (kernel, kernel), padding='same'),
        BatchNormalization(),
        Activation('relu'),
        Convolution2D(512, (kernel, kernel), padding='same'),
        BatchNormalization(),
        Activation('relu'),
        Convolution2D(512, (kernel, kernel), padding='same'),
        BatchNormalization(),
        Activation('relu'),
        MaxPooling2D(pool_size = (pool_size,pool_size)),

        Convolution2D(512, (kernel, kernel), padding='same'),
        BatchNormalization(),
        Activation('relu'),
        Convolution2D(512, (kernel, kernel), padding='same'),
        BatchNormalization(),
        Activation('relu'),
        Convolution2D(512, (kernel, kernel), padding='same'),
        BatchNormalization(),
        Activation('relu'),
        MaxPooling2D(pool_size = (pool_size,pool_size)),
    ]

    autoencoder = models.Sequential()
    autoencoder.encoding_layers = encoding_layers

    for l in autoencoder.encoding_layers:
        autoencoder.add(l)

    decoding_layers = [
        UpSampling2D(),
        Convolution2D(512, (kernel, kernel), padding='same'),
        BatchNormalization(),
        Activation('relu'),
        Convolution2D(512, (kernel, kernel), padding='same'),
        BatchNormalization(),
        Activation('relu'),
        Convolution2D(512, (kernel, kernel), padding='same'),
        BatchNormalization(),
        Activation('relu'),

        UpSampling2D(),
        Convolution2D(512, (kernel, kernel), padding='same'),
        BatchNormalization(),
        Activation('relu'),
        Convolution2D(512, (kernel, kernel), padding='same'),
        BatchNormalization(),
        Activation('relu'),
        Convolution2D(256, (kernel, kernel), padding='same'),
        BatchNormalization(),
        Activation('relu'),

        UpSampling2D(),
        Convolution2D(256, (kernel, kernel), padding='same'),
        BatchNormalization(),
        Activation('relu'),
        Convolution2D(256, (kernel, kernel), padding='same'),
        BatchNormalization(),
        Activation('relu'),
        Convolution2D(128, (kernel, kernel), padding='same'),
        BatchNormalization(),
        Activation('relu'),

        UpSampling2D(),
        Convolution2D(128, (kernel, kernel), padding='same'),
        BatchNormalization(),
        Activation('relu'),
        Convolution2D(64, (kernel, kernel), padding='same'),
        BatchNormalization(),
        Activation('relu'),

        UpSampling2D(),
        Convolution2D(64, (kernel, kernel), padding='same'),
        BatchNormalization(),
        Activation('relu'),
        Convolution2D(n_labels, (1, 1), padding='valid', activation="sigmoid"),
        BatchNormalization(),
    ]
    autoencoder.decoding_layers = decoding_layers
    for l in autoencoder.decoding_layers:
        autoencoder.add(l)

    autoencoder.add(Reshape((n_labels, img_h * img_w)))
    autoencoder.add(Permute((2, 1)))
    autoencoder.add(Activation('softmax'))



    return autoencoder

model = build_model(img_w, img_h, pool_size)

但是它返回了我一个错误.

But it returns me error.

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-21-051f06a53a14> in <module>()
----> 1 model = build_model(img_w, img_h, pool_size)

<ipython-input-20-c37fd94c8641> in build_model(img_w, img_h, pool_size)
    119         autoencoder.add(l)
    120 
--> 121     autoencoder.add(Reshape((n_labels, img_h * img_w)))
    122     autoencoder.add(Permute((2, 1)))
    123     autoencoder.add(Activation('softmax'))
    ValueError: total size of new array must be unchanged

我看不到任何错误原因.当我将img_w和img_h更改为256时,此错误已解决,但问题是这不是图像大小或原始数据集,因此我无法使用它.该如何解决?

I can't see any reason for the error. When I change img_w and img_h to 256, this error is resolved but problem is that's not the image size or original dataset so I can't use that. How to resolve this?

推荐答案

问题是您正在执行(2, 2)下采样5次,因此,让我们跟踪形状:

The problem is that you are performing (2, 2) downsampling 5 times so, let's track the shape:

(360, 480) -> (180, 240) -> (90, 120) -> (45, 60) -> (22, 30) -> (11, 15)

现在进行上采样:

(11, 15) -> (22, 30) -> (44, 60) -> (88, 120) -> (176, 240) -> (352, 480)

因此,当您尝试使用原始形状reshape输出时-由于模型不匹配而引起了问题.

So, when you try to reshape the output using original shape - the problem is raised due to model mismatch.

可能的解决方案:

  1. 调整图像的大小,以使两个输入尺寸都可以被32整除(例如,(352, 480)(384, 480).

在第三次采样后添加ZeroPadding2D(((1, 0), (0, 0))),将形状从(44, 60)更改为(45, 60),这将使您的网络具有良好的输出形状.

Add ZeroPadding2D(((1, 0), (0, 0))) after 3rd upsampling to change the shape from (44, 60) to (45, 60), what will make your network finish with a good output shape.

其他问题:

请确定最后一个MaxPooling2D之后是第一个Upsampling2D.这可能是一个问题,因为这是您网络的无用瓶颈.

Please find out that the last MaxPooling2D is followed by the first Upsampling2D. This might be a problem as this is an useless bottlenecking of your network.

这篇关于Keras中的Segnet:新阵列的总大小必须保持不变错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆