web-dev-qa-db-ja.com

ValueError:入力形状が[?、1,1,64]の 'max_pooling2d_6 / MaxPool'(op: 'MaxPool')の1から2を引くことによって引き起こされる負の寸法サイズ

入力画像の高さと幅を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)
6
aaaaa

これを交換してください:

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

これとともに:

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

ダウンサンプリング中の寸法を防ぐため。

1
Dr Sudeep Ghosh

かつて同じエラーが発生しました。このエラーは、入力サイズがダウンサンプルの数(最大プーリングレイヤー)より小さい場合に発生します。

つまり、たとえば、(2,2)回の最大プーリングレイヤーを(256,256,3)の入力サイズに適用すると、入力サイズが(1、 1、...)(理解するための単なる例)。この時点で、size(2,2)のMaxpoolが適用されると、入力サイズは負になります。

2つの簡単な解決策があります:-

  1. 入力サイズを増やす、または
  2. Maxpoolingレイヤーを減らす

私は個人的には最初のソリューションを好みます。

0
Abhishek Pandey