Keras中的Segnet:新阵列的总大小必须保持不变错误 [英] Segnet in Keras: total size of new array must be unchanged error
问题描述
我正在用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.
可能的解决方案:
-
调整图像的大小,以使两个输入尺寸都可以被
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屋!