ValueError: логиты и метки должны иметь одинаковую форму ((None, 4) vs (None, 1))

Я пытаюсь создать сверточную нейронную сеть, чтобы классифицировать собак и кошек. Я получил ошибку, упомянутую в заголовке.

Из моего поиска некоторые сказали, что ошибка относится к разным версиям библиотек tensorflow и keras, другие сказали, что это синтаксическая ошибка. Я оставлю здесь свой код, скажите, где я допустил ошибку.

      #IMPORTING LIBRARIES
import tensorflow as tf
import pandas as pd
import keras
from keras.preprocessing.image import ImageDataGenerator



#IMAGE DATA PREPROCESSING

#preprocessing the training set
train_datagen = ImageDataGenerator(
        rescale=1./255,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True)
training_set = train_datagen.flow_from_directory(
        directory = r"C:\Users\Cucu\Downloads\training_set",
        target_size=(64 , 64),
        batch_size=32,
        class_mode='binary')

#preprocessing the test set
test_datagen = ImageDataGenerator(rescale=1./255)
test_set = test_datagen.flow_from_directory(
        directory = r"C:\Users\Cucu\Downloads\test_set",
        target_size=(64 , 64),
        batch_size=32,
        class_mode='binary')


 
#BULDING THE CNN
#
#
#initialising the cnn
cnn = tf.keras.models.Sequential()


#convolution
cnn.add(tf.keras.Input(shape=(64, 64, 3)))
cnn.add(tf.keras.layers.Conv2D(filters = 32 , kernel_size = 3 , activation = 'relu' ))


#pooling
cnn.add(tf.keras.layers.MaxPool2D( pool_size = 2 , strides = 2))


#adding a SECOND CONVOLUTIONAL LAYER
cnn.add(tf.keras.layers.Conv2D(filters = 32 , kernel_size = 3 , activation = 'relu'))
cnn.add(tf.keras.layers.MaxPool2D( pool_size = 2 , strides = 2))


#flattening
cnn.add(tf.keras.layers.Flatten())


#full connection
cnn.add(tf.keras.layers.Dense(units = 128 , activation = 'relu'))


#adding the output layer
cnn.add(tf.keras.layers.Dense(units = 4 , activation = 'sigmoid'))




#TRAINING THE CNN
#
#
#compiling the cnn
cnn.compile(optimizer = 'adam' , loss = 'binary_crossentropy' , metrics = ['accuracy'] )


#training the cnn on the training_set & test_set
cnn.fit(x = training_set , validation_data = test_set , epochs = 25)



#MAKING A SINGLE PREDICTION
import numpy as np
test_image = image.load_img('dataset/single_predictioncat_or_dog_1.jpg' , test_size = (64 , 64))
test_image = image.img_to_array(test_image)
test_image = np.expand_dims(test_image , axis = 0)
result = cnn.predic(test_image)
training_set.class_indices

и ошибка:

      ValueError: logits and labels must have the same shape ((None, 4) vs (None, 1))

1 ответ

Меняем последний плотный слой. Вместо 4 сделайте 1.

      #adding the output layer
cnn.add(tf.keras.layers.Dense(units = 1 , activation = 'sigmoid'))

Это может происходить из-за того, что ваша метка представляет собой одно значение для каждого ввода. Принимая во внимание, что ваш последний определенный слой имеет 4 выхода. Функция потерь не может сравнивать две разные формы.

Если вы по-прежнему хотите добавить более одной единицы в последний плотный слой, сделайте все ваши выходы одним горячим вектором и добавьте столько единиц в плотном слое, сколько меток в вашем наборе данных.

Другие вопросы по тегам