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文件),如果有人遇到这种情况,这将对他们有所帮助。这也是一个简单的好例子。