Keras/Tenserflow — Не удается заставить model.fit() работать

#python #tensorflow #machine-learning #keras #conv-neural-network

#питон #тензорный поток #машинное обучение #keras #conv-нейронная сеть

Вопрос:

Я пытаюсь создать сеть CNN, чтобы делать прогнозы по изображениям грибов.

К сожалению, я даже не могу начать тренировать свою модель, метод fit() всегда выдает мне ошибки.

Существует 10 классов, наборы данных tf правильно нашли свои имена на основе их вложенных папок.

С моим текущим кодом это говорит:

 InvalidArgumentError: logits and labels must have the same first dimension, got logits shape [12800,10] and labels shape [32]  

Краткое описание модели:

 Layer (type) Output Shape Param #  =================================================================  input_5 (InputLayer) [(None, 64, 64, 3)] 0    conv2d_4 (Conv2D) (None, 62, 62, 32) 896    max_pooling2d_2 (MaxPooling (None, 20, 20, 32) 0  2D)      re_lu_2 (ReLU) (None, 20, 20, 32) 0    dense_2 (Dense) (None, 20, 20, 10) 330       =================================================================  

Вот мой код:

 #Data loading train_set = keras.preprocessing.image_dataset_from_directory(  data_path,   labels="inferred",  label_mode="int",  batch_size=32,   image_size=(64, 64),  shuffle=True,  seed=1446,  validation_split = 0.2,  subset="training")  validation_set = keras.preprocessing.image_dataset_from_directory(  data_path,   labels="inferred",  label_mode="int",  batch_size=32,   image_size=(64, 64),  shuffle=True,  seed=1446,  validation_split = 0.2,  subset="validation")  #Constructing layers input_layer = keras.Input(shape=(64, 64, 3)) x = layers.Conv2D(filters=32, kernel_size=(3, 3), activation="relu")(input_layer) x = layers.MaxPooling2D(pool_size=(3, 3))(x) x = keras.layers.ReLU()(x) output = layers.Dense(10, activation="softmax")(x)  #Making and fitting the model model = keras.Model(inputs=input_layer, outputs=output) model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics=['accuracy']) model.fit(train_set, epochs=5, validation_data=validation_set)  

Комментарии:

1. Добро пожаловать. Пожалуйста, расскажите нам, в чем именно заключается ваша ошибка. Кроме того, не используйте input в качестве имени переменной, так input как это встроенная функция.

2. Я исправил имя входной переменной. В текущем коде он выплевывает: «логиты и метки должны иметь одно и то же первое измерение, иметь форму логитов [12800,10] и форму меток [32]».

Ответ №1:

Я думаю, что вам нужно выровнять, прежде чем переходить к Dense слою

 input_layer = keras.Input(shape=(64, 64, 3)) x = layers.Conv2D(filters=32, kernel_size=(3, 3), activation="relu")(input_layer) x = layers.MaxPooling2D(pool_size=(3, 3))(x) x = keras.layers.ReLU()(x) x = keras.layers.Flatten()(x) # try adding this output = layers.Dense(10, activation="softmax")(x)  

Комментарии:

1. Это сработало, огромное спасибо! Я собираюсь посмотреть это, чтобы попытаться понять, почему. По крайней мере, теперь я действительно могу начать работать 🙂

Ответ №2:

что вам нужно сделать, так это добавить выравнивающий слой в вашу модель между слоем ReLU и выходным слоем.

 input_layer = keras.Input(shape=(64, 64, 3)) x = layers.Conv2D(filters=32, kernel_size=(3, 3), activation="relu")(input_layer) x = layers.MaxPooling2D(pool_size=(3, 3))(x) x = keras.layers.ReLU()(x) x = keras.layers.Flatten()(x) output = layers.Dense(10, activation="softmax")(x)  

Когда вы видите модель.если возникает ошибка из — за разницы в логинах и метках, рекомендуется распечатать сводку модели

 print(model.summary())  

Просматривая резюме, оно обычно помогает понять, что не так.

Комментарии:

1. Это сработало, и отличный совет, я обновлю свой пост резюме на случай, если кто-нибудь столкнется с той же проблемой, что и я.