Deep learning 因'的1减去2而导致的负尺寸大小;max#u Poolg2D#u 52/MaxPool';(op:';MaxPool';)具有以下输入形状:[?,148,1,32]

Deep learning 因'的1减去2而导致的负尺寸大小;max#u Poolg2D#u 52/MaxPool';(op:';MaxPool';)具有以下输入形状:[?,148,1,32],deep-learning,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 impo

我得到了这个无效的参数错误,也得到了最大池层的值错误。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。最后,你不能再缩小你的样本规模,但你要继续尝试(显然是在max_pooling_2d_52)


包含完整的tracelog将更容易解释您的问题:)

不要使任何层输入大小小于其过滤器大小,否则将抛出错误

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

  • n:输入维度
  • f:过滤器尺寸
  • s:迈步
  • p:填充
默认填充为零(也称为有效填充),在您的示例中,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'))