python - CNN - 检测手写表情:ValueError:无法将输入数组从形状 (26,26,3) 广播到形状 (26)
问题描述
在我的根文件夹中,images
我有三个名为0
, 1
,的文件夹2
。文件夹0
中有no smilies
. 文件夹1
中有happy handwritten smilies
,文件夹2
中有sad handwritten smilies
。图像是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)
我认为数据结构或数组结构有问题。我不知道我做错了什么。也许有人知道这个问题,可以给我一个提示!
在这里,您可以将整个项目下载为 zip 文件。 http://fileshare.mynotiz.de/cnn-handwritten-smilies.zip
解决方案
我发现了问题。我的一张测试数据图像不是 26x26 格式,而是 26x23。
推荐阅读
- android - OpenGL ES 2.0/3.0 中的彩虹色效果。更换黑色区域
- ssh - 将 VSCODE 与 Google Colab 连接时出现身份验证错误
- scripting - 检索用户名列表打开了我的 Instagram 故事
- java - SQLiteBlobTooBigException - 华为设备、Android 9 和 10
- javascript - DOM 渲染成 svelte 后执行函数
- python - 给定一定数量的节点,如何获得所有树形图?网络x
- xamarin - 在 Xamarin Forms 中调整图像大小
- python - seaborn 用颜色绘制一个 numpy 矩阵
- bittorrent - Bittorrent:get_peers DHT 响应中的令牌大小
- javascript - Javascript – 将多个值返回给链接的“then”函数