2017-07-08 85 views
2

我用Keras實現了以下模型。在下面,我使用Tensorflow。MaxPool上的負尺寸大小

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

model = Sequential() 
model.add(Conv2D(32, (2, 2), input_shape=(3, 150, 150), padding='SAME')) 
model.add(Activation('relu')) 
# model.add(MaxPooling2D(pool_size=(2, 2))) 
model.add(MaxPooling2D(pool_size=(2, 2), data_format="channels_last")) 

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

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

不過,我得到這個異常:

tensorflow.python.framework.errors_impl.InvalidArgumentError: Negative dimension size caused by subtracting 2 from 1 for 'max_pooling2d_2/MaxPool' (op: 'MaxPool') with input shapes: [?,1,75,32]. 

我使用SAME填充,和2*2卷積,所以輸出應該是2*2,我應該能夠在其上運行MaxPooling。

我只是不明白如何輸入可以達到形狀[?,1,75,32]

回答

2

問題是您的第一個卷積的輸入大小。

您正在使用張量流和「通道最後」佈局。 因此,您需要在通道之前指定x和y分辨率。

model.add(Conv2D(32, (2, 2), input_shape=(150, 150, 3), padding='SAME')) 

您最初的形狀是[?, 3, 150, 150],彙集適用於第二個和第三個項目,這就是如何形狀[?, 1, 75, 32]創建。 32是卷積中的濾鏡數量。

如果你想保持你的過濾器沿第一軸,Keras有一個配置文件,在Linux下這應該是/home/user/.keras/keras.json。在此配置文件中,您可以更改通道佈局,該選項被稱爲image_data_format。您可以在channels_firstchannels_last之間切換。

+0

我改變了'channels_last'到'c​​hannels_first'但我仍然得到同樣的錯誤。 – octavian

+0

你在哪裏改變它?在配置文件中?你是否從maxpooling中移除了參數? – lhk

+1

哦,我忘記了改變MaxPool的參數。 – octavian