如何修复CNN训练时validation_split相关的ValueError错误
错误根源
- 直接触发报错的原因:你存储的标签
y是Python原生int组成的列表,没有转为NumPy数组,Keras的validation_split参数仅支持张量/NumPy数组类型的输入,识别不了Python列表。 - 你怀疑的reshape操作确实存在逻辑问题:
cv2.imread默认读取3通道BGR彩色图像,你直接将3通道数据reshape为1通道,会破坏图像原始结构,PyCharm的提示就是因为实际读取的数组维度和你reshape指定的维度不匹配。
修复方案
1. 修改生成训练数据的代码
你可以选择用单通道灰度图训练,修改imread逻辑,同时把y转为NumPy数组再存储:
# 读图片的时候加灰度参数 img_array = cv2.imread(os.path.join(path,img), cv2.IMREAD_GRAYSCALE) # ... 其余遍历代码不变 # 存pickle之前把y转成numpy数组 y = np.array(y) # 读文件建议用with上下文管理器,不用手动处理关闭 with open("X.pickle","wb") as pickle_out: pickle.dump(X, pickle_out) with open("y.pickle","wb") as pickle_out: pickle.dump(y, pickle_out)
如果你想用3通道彩色图训练,就不需要改imread逻辑,把reshape的最后一个维度改成3即可:
X = np.array(X).reshape(-1, IMG_SIZE, IMG_SIZE, 3)
2. (可选)优化模型结构
原代码的全连接层没有加激活函数,会降低模型拟合能力,建议修改:
model.add(Dense(64)) model.add(Activation('relu')) # 新增激活函数 model.add(Dropout(0.2)) # 新增dropout层防止过拟合
修改完成后重新生成数据集,再运行训练代码即可解决报错。
内容的提问来源于stack exchange,提问作者Gabriel Rossignol
相关产品推荐
相关产品推荐

