在我的根目录 images
中,我有三个名为 0
、1
和 2
的文件夹。在文件夹 0
中没有 笑脸
。在文件夹 1
中有 开心的书写笑脸
,而在文件夹 2
中有 难过的书写笑脸
。这些图片是尺寸为 26x26
的 jpg
彩色图像。
这是我的代码
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。