输入形状为[?,148,1,32]的'max_pooling2d_52 / MaxPool'(op:'MaxPool')的1中减去2导致的负尺寸大小。

时间:2020-02-25 07:48:37

标签: deep-learning

我收到此无效参数错误,同时在最大池化层中也收到值错误。 dim ordering ='th'也不起作用。我不明白为什么会这样。请帮助某人...预先感谢

from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
from keras.preprocessing.image import ImageDataGenerator

model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=(150, 150, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(128, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(512, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(512, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(1024, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())  
model.add(Dense(1024))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))

model.summary()

2 个答案:

答案 0 :(得分:0)

您池中的次数太多。

每次样本通过合并层之一时,其宽度和高度均被二除。最后,您不能再缩小样本规模,而是继续尝试(显然在max_pooling_2d_52)。

包括完整的跟踪日志将使您更容易解释问题:)

答案 1 :(得分:0)

任何层输入大小都不能小于其过滤器大小,否则会引发错误。

输出大小(尺寸)的计算公式为:[(n-f + p)/ s] +1其中,

  • n:输入尺寸
  • f:过滤器大小
  • s:大步前进
  • p:填充

默认填充为零(也称为VALID填充),因为在您的情况下p为默认填充,因此p = 0

默认跨度为1,因为您的情况s也为默认跨度,所以s = 1

因此,根据您的情况计算输出尺寸的公式为:n-f +1

最大池化层将尺寸减小一半,即n / 2

现在让我们打破模型层,进行计算 在每一层之后输出形状,并查看您在哪里出错。

model = Sequential()
#  size : 150 * 150 *3 (  given image size)
model.add(Conv2D(32, (3, 3), input_shape=(150, 150, 3)))
model.add(Activation('relu'))

# size :  148 * 148 * 32  ( as : n-f+1 =  150 -3+1  =148 ) 

model.add(MaxPooling2D(pool_size=(2, 2)))

# size :  74 * 74 * 32  ( as : n/2 = 148/2 = 74)

model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))

# size :   72 * 72 * 32    (74-3+1 =72)

model.add(MaxPooling2D(pool_size=(2, 2)))

# size :36 * 36 * 32    ( 72/2 = 36)

model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))

# size : 34 * 34* 64   (36-3+1 =34)

model.add(MaxPooling2D(pool_size=(2, 2)))

# size : 17 * 17 * 64  ( 34/2 = 17)

model.add(Conv2D(128, (3, 3)))
model.add(Activation('relu'))

# size : 15* 15 * 128   ( 17-3+1 =15)

model.add(MaxPooling2D(pool_size=(2, 2)))

# size : 7 * 7 * 128  ( 15/2 = 7)

model.add(Conv2D(512, (3, 3)))
model.add(Activation('relu'))

# size : 5 * 5 * 512   (7-3+1 = 5)

model.add(MaxPooling2D(pool_size=(2, 2)))

# size : 2* 2* 512    (5/2 = 2)

model.add(Conv2D(512, (3, 3)))

## now here your n is 2 but f is 3 and n-f  is -1 i.e. negative hence the error


model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(1024, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())  
model.add(Dense(1024))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))