#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. Это сработало, и отличный совет, я обновлю свой пост резюме на случай, если кто-нибудь столкнется с той же проблемой, что и я.