ValueError:通过从&1; max_pooling2d_6 / MaxPool' max_pooling2d_6 / MaxPool'中减去2而导致的负尺寸大小。 (op:' MaxPool')输入形状:[?,1,1,64]

时间:2018-03-02 23:51:36

标签: python neural-network deep-learning keras conv-neural-network

当我保持输入图像的高度和宽度低于362X362时,我收到负尺寸大小的错误。我很惊讶,因为这个错误通常是由于错误的输入尺寸引起的。我没有找到任何数字或行和列可能导致错误的原因。以下是我的代码 -

batch_size = 32
num_classes = 7
epochs=50
height = 362
width = 362

train_datagen = ImageDataGenerator(
        rotation_range=40,
        width_shift_range=0.2,
        height_shift_range=0.2,
        rescale=1./255,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True,
        fill_mode='nearest')

test_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
    'train',
        target_size=(height, width),
        batch_size=batch_size,
        class_mode='categorical')

validation_generator = test_datagen.flow_from_directory(
     'validation',
        target_size=(height, width),
        batch_size=batch_size,
        class_mode='categorical')

base_model = InceptionV3(weights='imagenet', include_top=False, input_shape=
(height,width,3))

x = base_model.output
x = Conv2D(32, (3, 3), use_bias=True, activation='relu') (x) #line2
x = MaxPooling2D(pool_size=(2, 2))(x)
x = Conv2D(64, (3, 3), activation='relu') (x) #line3
x = MaxPooling2D(pool_size=(2, 2))(x)
x = Flatten()(x)
x = Dense(batch_size, activation='relu')(x) #line1
x = (Dropout(0.5))(x)
predictions = Dense(num_classes, activation='softmax')(x)
model = Model(inputs=base_model.input, outputs=predictions)

for layer in base_model.layers:
    layer.trainable = False

model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=
['accuracy'])

model.fit_generator(
        train_generator,
        samples_per_epoch=128,
        nb_epoch=epochs,
        validation_data=validation_generator,
        verbose=2)

for i, layer in enumerate(base_model.layers):
    print(i, layer.name)

for layer in model.layers[:309]:
    layer.trainable = False
for layer in model.layers[309:]:
    layer.trainable = True

from keras.optimizers import SGD
model.compile(optimizer=SGD(lr=0.0001, momentum=0.9), 
loss='categorical_crossentropy', metrics=['accuracy'])

model.save('my_model.h5')
model.fit_generator(
        train_generator,
        samples_per_epoch=512,
        nb_epoch=epochs,
        validation_data=validation_generator,
        verbose=2)

5 个答案:

答案 0 :(得分:4)

InceptionV3非常积极地对输入图像进行下采样。对于输入362x362图像,base_model.output张量为(?, 9, 9, 2048) - 如果您写的话很容易看到

base_model.summary()

之后,您的模型会进一步对(?, 9, 9, 2048)张量进行下采样(例如在this question中):

(?, 9, 9, 2048)  # input
(?, 7, 7, 32)    # after 1st conv-2d
(?, 3, 3, 32)    # after 1st max-pool-2d
(?, 1, 1, 64)    # after 2nd conv-2d
error: can't downsample further!

您可以通过添加padding='same'参数来阻止conv层减小张量大小,即使这会使错误消失。或者简单地减少缩减样本的数量。

答案 1 :(得分:0)

替换此:

x = MaxPooling2D(pool_size=(2, 2))(x)

与此:

x = MaxPooling2D((2,2), padding='same')(x)

以防止在下采样期间出现尺寸。

答案 2 :(得分:0)

我曾经遇到过同样的错误。当您的输入大小小于向下采样的数量(最大合并层)时,会出现此错误。

换句话说,例如,当您将最大池化层(例如,(2,2)次)应用于输入大小(例如(256,256,3))时,当输入大小变为(1,1,...)(仅是一个示例即可理解)。此时,当应用大小为(2,2)的Maxpool时,输入大小将变为负数。

有两种简单的解决方案:-

  1. 增加输入大小,或
  2. 减少最大缓冲层

我个人更喜欢第一种解决方案。

答案 3 :(得分:0)

这里的问题在keras和TF中有不同的原因。

在keras中:根据使用的后端框架更改输入形状或更改dim_ordering =(tf / th)

在tensorflow中:转到出现错误的代码行,并将padding ='valid'参数更改为padding ='same'。如果该参数不存在,则按以下示例添加。

model.add(MaxPooling2D((2,2), strides=(2,2), padding='same'))

有关该主题的更多信息,请点击此处-https://www.tensorflow.org/api_docs/python/tf/keras/layers/MaxPool2D

答案 4 :(得分:0)

我不想将大小从 t-1 增加到 t-3 或 t-6 或 t-12 所以我减少了最大池层

model.add(MaxPooling1D(pool_size=2))

model.add(MaxPooling1D(pool_size=1))