Bilal
Bilal

Reputation: 3854

ValueError: logits and labels must have the same shape

Error:

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

My Code is:

import numpy as np
import keras
from keras import layers
from keras import Sequential
# Define Window size (color images)
img_window = (32,32,3)

# Flatten the Window shape
input_shape = np.prod(img_window)
print(input_shape)

# Define MLP with two hidden layers(neurons)
simpleMLP = Sequential(
    [layers.Input(shape=img_window),
     layers.Flatten(), # Flattens the input, conv2D to 1 vector , which does not affect the batch size.
     layers.Dense(input_shape//2 ,activation="relu"),
     layers.Dense(input_shape//2 ,activation="relu"),
     layers.Dense(2,activation="sigmoid"),
     ]
)
# After model is "built" call its summary() menthod to display its contents
simpleMLP.summary()

# Initialization
# Size of the batches of data, adjust it depends on RAM
batch_size = 128
epochs = 5
# Compile MLP model with 3 arguments: loss function, optimizer, and metrics function to judge model performance
simpleMLP.compile(loss="binary_crossentropy",optimizer="adam",metrics=["binary_accuracy"])  #BCE

# Create ImagedataGenerator to splite training, validation dataset
from keras.preprocessing.image import ImageDataGenerator

train_dir = '/content/train'
train_datagen = ImageDataGenerator(
    rescale=1./255, # rescaling factor
    shear_range=0.1,
    zoom_range=0.1,
    horizontal_flip=True,
    fill_mode='nearest')

valid_dir = '/content/valid'
valid_datagen =ImageDataGenerator(
    rescale=1./255,
    shear_range=0.1,
    zoom_range=0.1,
    horizontal_flip=True,
    fill_mode='nearest')


train_generator = train_datagen.flow_from_directory(
    train_dir,
    target_size=img_window[:2],
    batch_size=batch_size,
    class_mode='binary',
    color_mode='rgb'
    )

validation_generator = valid_datagen.flow_from_directory(
    valid_dir,
    target_size=img_window[:2],
    batch_size=batch_size,
    class_mode='binary',
    color_mode='rgb')

# Train the MLP model
simpleMLP.fit_generator((
    train_generator, 
    steps_per_epoch= 8271 // batch_size,
    epochs=5,
    validation_data=validation_generator,
    validation_steps= 2072 // batch_size)

Can you please advise me how to resolve this problem? thanks in advance.

Upvotes: 0

Views: 665

Answers (1)

thushv89
thushv89

Reputation: 11333

You problem simply is that, you have got labels of shape (N, 1) and loss defined as binary_crossentropy. This means you should have a single output node in the last layer. But you have a model that outputs two classes.

simpleMLP = Sequential(
    [...
     layers.Dense(2,activation="sigmoid"),
     ]
)

Simply change this to,

simpleMLP = Sequential(
    [...
     layers.Dense(1,activation="sigmoid"),
     ]
)

Upvotes: 1

Related Questions