local d drive run CNN to error Input 0 of layer "sequential" is incompatible with the layer

Question:

I try to run it by training a simple Convolutional Neural Network (CNN) to captcha images.
training model tells me the captcha number.
but run model.fit tell me error message
ValueError: Input 0 of layer "sequential" is incompatible with the layer: expected shape=(None, 38, 321, 3), found shape=(None, 321, 38, 3)

python.py

IMAGEPATH = 'captcha'
dirs = os.listdir(IMAGEPATH)
  
images=[]
test_images=[]
train_labels=[]
train_images, train_labels = [],[]
test_labels=[]

X=[]
Y=[]

w=38 
h=321 
i=0

for name in dirs:
    file_paths = glob.glob(path.join(IMAGEPATH+"/"+name, '*.*'))
    for path3 in file_paths:
        try:  
            img = cv2.imread(path3)
            img = cv2.resize(img, (w, h))
            im_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
            ret, im_res = cv2.threshold(im_rgb,180,255,cv2.THRESH_BINARY)
            if img is not None:
                images.append(im_res)
                test_images.append(im_res)
                name=path3.split(os.path.sep)[-1]
                getdata=(name.split('.')[-2])
                labels=getdata.split('-')[-1]
                train_labels.append(labels)
                #train_labels.append(i)
            i=i+1
        except:
            print(os.path.join(file_paths,name),"error!")
            pass

print(len(images),len(train_labels))

images=np.array(images)
train_labels==np.array(train_labels)

(X_train, X_test, Y_train, Y_test) = train_test_split(images, train_labels, test_size=0.2, random_state=0) 

X_train_normalize=X_train.reshape(X_train.shape).astype("float")/255.0
X_test_normalize=X_test.reshape(X_test.shape).astype("float")/255.0

lb = LabelBinarizer().fit(Y_train)
Y_train_OneHot = lb.transform(Y_train)
Y_test_OneHot = lb.transform(Y_test)

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(w,h,3)))
model.add(tf.keras.layers.MaxPooling2D((2, 2)))
model.add(tf.keras.layers.Conv2D(64, (3, 3), activation='relu'))
model.add(tf.keras.layers.MaxPooling2D((2, 2)))
model.add(tf.keras.layers.Conv2D(64, (3, 3), activation='relu'))

model.summary()

model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

history = model.fit(X_train_normalize,
                              epochs=10
                              )

My local d drive in save twenty-four captcha images.

Path

captchaA3F0Ateacher-26.jpg
captcha1673A2teacher-24.jpg
captcha1E82F1teacher-25.jpg
captcha33C958teacher-20.jpg
captcha33DC34teacher-17.jpg
captcha3AF35Eteacher-14.jpg
captcha3B1C9Eteacher-12.jpg
captcha4207C9teacher-9.jpg
captcha4B5AC4teacher-21.jpg
captcha4DD685teacher-3.jpg
captcha4E44F0teacher-16.jpg
captcha6BEBFEteacher-11.jpg
captcha6DCE49teacher-15.jpg
captcha6E16E9teacher-4.jpg
captchac8BA540teacher-8.jpg
captcha949BA9teacher-23.jpg
captcha99F671teacher-7.jpg
captchaA1564Dteacher-10.jpg
captchaA4B883teacher-13.jpg
captchaD27153teacher-6.jpg
captchaD36E65teacher-19.jpg
captchaDC602Ateacher-22.jpg
captchaDDE328teacher-18.jpg
captchaDED2FBteacher-2.jpg

error message.

Showing Error

d:OpecvImagelookthree.py:83: UserWarning: `Model.fit_generator` is deprecated and will be removed in a future version. Please use `Model.fit`, which supports generators.
  history = model.fit_generator(X_train_normalize,
Traceback (most recent call last):
  File "d:OpecvImagelookthree.py", line 83, in <module>
    history = model.fit_generator(X_train_normalize,
  File "C:UsersuserAppDataLocalProgramsPythonPython39libsite-packageskerasenginetraining.py", line 2209, in fit_generator
    return self.fit(
  File "C:UsersuserAppDataLocalProgramsPythonPython39libsite-packageskerasutilstraceback_utils.py", line 67, in error_handler
    raise e.with_traceback(filtered_tb) from None
  File "C:UsersuserAppDataLocalProgramsPythonPython39libsite-packagestensorflowpythonframeworkfunc_graph.py", line 1147, in autograph_handler
    raise e.ag_error_metadata.to_exception(e)
ValueError: in user code:

    File "C:UsersuserAppDataLocalProgramsPythonPython39libsite-packageskerasenginetraining.py", line 1021, in train_function  *
        return step_function(self, iterator)
    File "C:UsersuserAppDataLocalProgramsPythonPython39libsite-packageskerasenginetraining.py", line 1010, in step_function  **
        outputs = model.distribute_strategy.run(run_step, args=(data,))
    File "C:UsersuserAppDataLocalProgramsPythonPython39libsite-packageskerasenginetraining.py", line 1000, in run_step  **
        outputs = model.train_step(data)
    File "C:UsersuserAppDataLocalProgramsPythonPython39libsite-packageskerasenginetraining.py", line 859, in train_step
        y_pred = self(x, training=True)
    File "C:UsersuserAppDataLocalProgramsPythonPython39libsite-packageskerasutilstraceback_utils.py", line 67, in error_handler
        raise e.with_traceback(filtered_tb) from None
    File "C:UsersuserAppDataLocalProgramsPythonPython39libsite-packageskerasengineinput_spec.py", line 264, in assert_input_compatibility
        raise ValueError(f'Input {input_index} of layer "{layer_name}" is '

    ValueError: Input 0 of layer "sequential" is incompatible with the layer: expected shape=(None, 38, 321, 3), found shape=(None, 321, 38, 3)

Asked By: Paul

||

Answers:

i modified cv2.resize(img, (w, h)) to cv2.resize(img, (h, w))

Add Dense layers on top

model.add(tf.keras.layers.Flatten())

model.add(tf.keras.layers.Dense(512, activation='relu'))

model.add(tf.keras.layers.Dense(27))

modified Compile and train the model

model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])
history = model.fit(X_train, Y_train_OneHot, epochs=10, validation_data=(X_test, Y_test_OneHot))

Simple Code

import tensorflow as tf
from sklearn.model_selection import train_test_split
import glob
import numpy as np
import os.path as path
import os
import cv2
from sklearn.preprocessing import LabelBinarizer


IMAGEPATH = 'captcha'
dirs = os.listdir(IMAGEPATH)
  
images=[]
test_images=[]
train_labels=[]

w=38
h=321

for name in dirs:
    file_paths = glob.glob(path.join(IMAGEPATH+"/"+name, '*.*'))
    for path3 in file_paths:
        try:  
            img = cv2.imread(path3)
            img = cv2.resize(img, (h, w))
            im_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
            ret, im_res = cv2.threshold(im_rgb,180,255,cv2.THRESH_BINARY)
            if img is not None:
                images.append(im_res)
                test_images.append(im_res)
                name=path3.split(os.path.sep)[-1]
                getdata=(name.split('.')[-2])
                labels=getdata.split('-')[-1]
                getint=int(labels)
                train_labels.append(getint)
        except:
            print(os.path.join(file_paths,name),"error!")
            pass

print(len(images),len(train_labels))

images=np.array(images)
train_labels==np.array(train_labels)

(X_train, X_test, Y_train, Y_test) = train_test_split(images, train_labels, test_size=0.2, random_state=0) 

X_train_normalize=X_train.reshape(X_train.shape).astype("float")/255.0
X_test_normalize=X_test.reshape(X_test.shape).astype("float")/255.0

lb = LabelBinarizer().fit(Y_train)
Y_train_OneHot = lb.transform(Y_train)
Y_test_OneHot = lb.transform(Y_test)

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(w,h,3)))
model.add(tf.keras.layers.MaxPooling2D((2, 2)))
model.add(tf.keras.layers.Conv2D(64, (3, 3), activation='relu'))
model.add(tf.keras.layers.MaxPooling2D((2, 2)))
model.add(tf.keras.layers.Conv2D(64, (3, 3), activation='relu'))


model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(512, activation='relu'))
model.add(tf.keras.layers.Dense(27))

model.summary()

model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])

history = model.fit(X_train, Y_train_OneHot, epochs=10, validation_data=(X_test, Y_test_OneHot))
Answered By: Paul
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.