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

在我的根目录 images 中,我有三个名为 012 的文件夹。在文件夹 0 中没有 笑脸。在文件夹 1 中有 开心的书写笑脸,而在文件夹 2 中有 难过的书写笑脸。这些图片是尺寸为 26x26jpg 彩色图像。

这是我的代码

from keras.models import Sequentialfrom keras.layers import Dense, Conv2D, MaxPooling2D, Dropout, Flattenimport numpy as npimport osimport cv2from sklearn.model_selection import train_test_splitdef 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_classesdef 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 modellabels = [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 testingX_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 validationmodel = createModel(labels, images_dimension)batch_size = 20epochs = 100model.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") / 255ValueError: could not broadcast input array from shape (26,26) into shape (26)

我认为数据结构或数组结构有问题。我不知道自己哪里做错了。也许有人知道这个问题并能给我一些提示!

你可以在这里下载整个项目作为压缩文件。http://fileshare.mynotiz.de/cnn-handwritten-smilies.zip


回答:

我找到了问题所在。其中一张测试数据图像的格式不是 26×26,而是 26×23。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注