Python CNN-检测手写微笑:ValueError:无法将输入数组从形状(26,26,3)广播到形状(26)

Python CNN-检测手写微笑:ValueError:无法将输入数组从形状(26,26,3)广播到形状(26),python,opencv,machine-learning,keras,computer-vision,Python,Opencv,Machine Learning,Keras,Computer Vision,在我的根文件夹images中有三个文件夹,分别是0、1、2。在文件夹0中有没有微笑。文件夹1中有快乐的手写微笑和文件夹2中有悲伤的手写微笑。 图像为jpg彩色图像,尺寸为26x26 这是我的密码 from keras.models import Sequential from keras.layers import Dense, Conv2D, MaxPooling2D, Dropout, Flatten import numpy as np import os import cv2 from

在我的根文件夹
images
中有三个文件夹,分别是
0
1
2
。在文件夹
0
中有
没有微笑
。文件夹
1
中有
快乐的手写微笑
和文件夹
2
中有
悲伤的手写微笑
。 图像为
jpg
彩色图像,尺寸为
26x26

这是我的密码

from keras.models import Sequential
from keras.layers import Dense, Conv2D, MaxPooling2D, Dropout, Flatten
import numpy as np
import os
import cv2
from sklearn.model_selection import train_test_split

def getImages(path, classes):
    folder = os.listdir(path)
    classes_counter = 0
    images = []
    images_classes = []

    for x in range (0,len(folder)):
        myPicList = os.listdir(path+"/"+ str(classes[classes_counter]))
        for pic in myPicList:
            img_path = path+"/" + str(classes[classes_counter]) + "/" + pic
            img = cv2.imread(img_path)
            img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
            images.append(img)
            images_classes.append(classes_counter)
        classes_counter +=1

    images = np.array(images, dtype="float") / 255
    return images, images_classes

def createModel(classes, images_dimension):
    classes_amount = len(np.unique(classes))
    model = Sequential()
    model.add(Conv2D(32, kernel_size=(3, 3), padding='same', activation='relu', input_shape=images_dimension))
    model.add(Conv2D(32, kernel_size=(3, 3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))

    model.add(Conv2D(64, kernel_size=(3, 3), padding='same', activation='relu'))
    model.add(Conv2D(64, kernel_size=(3, 3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))

    model.add(Conv2D(64, kernel_size=(3, 3), padding='same', activation='relu'))
    model.add(Conv2D(64, kernel_size=(3, 3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))

    model.add(Flatten())
    model.add(Dense(512, activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(classes_amount, activation='softmax'))

    return model


labels = [0,1,2]
images, images_classes = getImages('training-images', labels)
images_dimension=(26,26,3)

X_train, X_test, Y_train, Y_test = train_test_split(images, images_classes, test_size=0.2)  # if 1000 images split will 200 for testing
X_train, X_validation, Y_train, Y_validation = train_test_split(X_train, Y_train, test_size=0.2) # if 1000 images 20% of remaining 800 will be 160 for validation

model = createModel(labels, images_dimension)
batch_size = 20
epochs = 100
model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])
history = model.fit(X_train, Y_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_data=(X_validation, Y_validation))
model.evaluate(X_test,Y_test,verbose=0)
images=np.array(images,dtype=“float”)/255行中,我得到了错误:

Traceback (most recent call last):
  File "train-nn.py", line 54, in <module>
    images, images_classes = getImages('training-images', labels)
  File "train-nn.py", line 24, in getImages
    images = np.array(images, dtype="float") / 255
ValueError: could not broadcast input array from shape (26,26) into shape (26)
回溯(最近一次呼叫最后一次):
文件“train nn.py”,第54行,在
图像,图像\u类=获取图像('training-images',标签)
getImages中第24行的文件“train nn.py”
images=np.array(images,dtype=“float”)/255
ValueError:无法将输入数组从形状(26,26)广播到形状(26)
我认为数据结构或数组结构有问题。我不知道我做错了什么。也许有人知道这个问题,可以给我一个提示

在这里,您可以下载整个项目作为zip文件。
我发现了这个问题。我的一个测试数据图像的格式不是26x26,而是26x23。

最好保持项目链接以供参考(zip文件),如果有人遇到这种情况,这将对他们有所帮助。这也是一个简单的好例子。