ValueError: Вход 0 слоя sequencetial_50 несовместим со слоем:: expected min_ndim = 4, найдено ndim = 3. Получена полная форма: [Нет, 224, 224] - PullRequest
0 голосов
/ 06 августа 2020

Я все время получаю эту ошибку. Если я добавлю (None, IMG_SIZE, IMG_SIZE, 1), я получу эту ошибку. И если я удалю (IMG_SIZE, IMG_SIZE, 1) 'none', я получу ошибку времени компиляции. У других, которых я видел, были похожие проблемы по другим причинам. Любая помощь будет очень принята. Спасибо!

def convolutional_model():
    
    from keras.utils import to_categorical
    from keras.models import Sequential
    from keras.layers import Conv2D
    from keras.layers import MaxPooling2D
    from keras.layers import Dense
    from keras.layers import Flatten
    from keras.optimizers import SGD
    from keras.preprocessing.image import ImageDataGenerator
    from tensorflow.keras.optimizers import RMSprop
    from keras.layers import Dropout
    from tensorflow import keras
    
    # create model
    model = Sequential()
#     model.add(keras.Input(shape=(None, IMG_SIZE, IMG_SIZE, 1)))
#     Convolutional layer 1 with 32 filters of kernel size[5,5] 
    model.add(Conv2D(filters=32, kernel_size=(5, 5), strides=(1, 1), activation='relu', input_shape=(IMG_SIZE, IMG_SIZE, 1)))
#     Pooling layer 1 with pool size[2,2] and stride 2 
    model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
    
#     Convolutional layer 2 with 64 filters of kernel size[5,5] 
    model.add(Conv2D(64, (5, 5), strides=(1, 1), activation='relu'))
#  Pooling layer 2 with pool size[2,2] and stride 2 
    model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))

    model.add(Flatten())
    
#     Dense layer whose output size is fixed in the hyper parameter: 
    model.add(Dense(units=32, activation='relu'))
    
#     Dropout layer with dropout probability 0.4 
    model.add(Dropout(0.4))


    
#     units is 2 because we have 2 classes to predict (cot or dog)
    model.add(Dense(units=2, activation='softmax'))
    
    # Compile model
#     model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
    
    # compile model
    model.compile(
             optimizer=RMSprop(lr=0.001),
             loss='binary_crossentropy',
             metrics=['accuracy'])
    return model

введите описание изображения здесь

подходящая модель

history = model.fit(x_train, steps_per_epoch=len(x_train),
validation_data=x_test, validation_steps=len(x_test), epochs=3, verbose=2)

ValueError: вход 0 слоя sequencetial_50 несовместим со слоем :: ожидалось min_ndim = 4, найдено ndim = 3. Получена полная форма: [Нет, 224, 224]

1 Ответ

0 голосов
/ 07 августа 2020

Входным слоям модели, которую вы создали, необходим четырехмерный тензор для работы, но тензор x_train, который вы ему передаете, имеет только три измерения.

Это означает, что вам нужно изменить свой обучающий набор с помощью. изменить форму (n_images, 286, 384, 1). Теперь вы добавили дополнительное измерение без изменения данных, и ваша модель готова к запуску.

вам необходимо изменить форму тензора x_train до 4-х измерений перед обучением модели. например:

x_train = x_train.reshape(-1, 224, 224, 1)

для получения дополнительной информации о входах keras Отметьте этот ответ

...