当我保持输入图像的高度和宽度低于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)
答案 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时,输入大小将变为负数。
有两种简单的解决方案:-
我个人更喜欢第一种解决方案。
答案 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))