簡體   English   中英

檢查模型輸入時出錯:預期conv2d_175_input具有4個維,但數組的形狀為(0,1)

[英]Error when checking model input: expected conv2d_175_input to have 4 dimensions, but got array with shape (0, 1)

我想訓練一個從以下層開始的深度網絡:

def cnn_model():
model = Sequential()

model.add(Conv2D(32, (3, 3), padding='same',
                 input_shape=(3,48, 48),
                 activation='relu'))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.2))

model.add(Conv2D(64, (3, 3), padding='same',
                 activation='relu'))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.2))

model.add(Conv2D(128, (3, 3), padding='same',
                 activation='relu'))
model.add(Conv2D(128, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.2))

model.add(Flatten())
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(NUM_CLASSES, activation='softmax'))
return model

model = cnn_model()
# let's train the model using SGD + momentum (how original).
lr = 0.01
sgd = SGD(lr=lr, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy',
          optimizer=sgd,
          metrics=['accuracy'])


def lr_schedule(epoch):
    return lr*(0.1**int(epoch/10))

使用以下生成器:

model = cnn_model()

# let's train the model using SGD + momentum
lr = 0.01
sgd = SGD(lr=lr, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy',
              optimizer=sgd,
              metrics=['accuracy'])
def lr_schedule(epoch):
    return lr * (0.1 ** int(epoch / 10))

batch_size = 32
epochs = 30

model.fit(X, Y,
          batch_size=batch_size,
          epochs=epochs,
          validation_split=0.2,
          callbacks=[LearningRateScheduler(lr_schedule),
                     ModelCheckpoint('model.h5', save_best_only=True)]
          )

(驗證生成器看起來類似)。

在訓練過程中,我得到了錯誤:

ValueError: Error when checking input: expected conv2d_175_input to have 4 dimensions, but got array with shape (0, 1)

輸入print(model.summary())后得到以下輸出

    _________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_175 (Conv2D)          (None, 32, 48, 48)        896       
_________________________________________________________________
conv2d_176 (Conv2D)          (None, 32, 46, 46)        9248      
_________________________________________________________________
max_pooling2d_85 (MaxPooling (None, 32, 23, 23)        0         
_________________________________________________________________
dropout_103 (Dropout)        (None, 32, 23, 23)        0         
_________________________________________________________________
conv2d_177 (Conv2D)          (None, 64, 23, 23)        18496     
_________________________________________________________________
conv2d_178 (Conv2D)          (None, 64, 21, 21)        36928     
_________________________________________________________________
max_pooling2d_86 (MaxPooling (None, 64, 10, 10)        0         
_________________________________________________________________
dropout_104 (Dropout)        (None, 64, 10, 10)        0         
_________________________________________________________________
conv2d_179 (Conv2D)          (None, 128, 10, 10)       73856     
_________________________________________________________________
conv2d_180 (Conv2D)          (None, 128, 8, 8)         147584    
_________________________________________________________________
max_pooling2d_87 (MaxPooling (None, 128, 4, 4)         0         
_________________________________________________________________
dropout_105 (Dropout)        (None, 128, 4, 4)         0         
_________________________________________________________________
flatten_28 (Flatten)         (None, 2048)              0         
_________________________________________________________________
dense_43 (Dense)             (None, 512)               1049088   
_________________________________________________________________
dropout_106 (Dropout)        (None, 512)               0         
_________________________________________________________________
dense_44 (Dense)             (None, 43)                22059     
=================================================================
Total params: 1,358,155
Trainable params: 1,358,155
Non-trainable params: 0

我嘗試了什么? 我正在閱讀有關“ Convolution2D” /“輸入形狀”的文檔https://keras.io/layers/convolutional/ ,所以我嘗試更改input_shape,我知道我的輸出應該是4D,但我不知道如何要做到這一點。 如果可以提供幫助,請分享。

謝謝

正如@nuric所提到的,問題在於輸入圖像的尺寸。

如果您輸入的圖像的高度為48,寬度為48,輸入通道為3,則結果為(3,48,48),那么您對模型的輸入為(批處理大小為3、48、48)。

這里的批次大小不過是給模型進行訓練的單個批次中訓練圖像的數量

偽代碼

training_list = []
for i in range(0, batch_size):
    image = read_image(training_set[i])
    training_list.append(image)
training_set = numpy.array(training_list)

所以現在訓練集的維數是(批量大小,3、48、48)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM