Keras卷积神经网络拟合数据时报ValueError无法适配输入问题求助
问题排查及修复方案
以下是你代码中的错误点及对应修复方法:
- 标签数据格式不匹配
报错明确说明输入的标签y是存储int类型的Python列表,Kerasmodel.fit()要求特征、标签输入均为numpy数组格式,你需要先将y转换为numpy数组。 - 重复实例化Sequential模型
你在添加第一层卷积、池化层后,再次执行了model = Sequential(),会直接清空已构建的上层网络结构,同时导致第二层卷积层缺少输入维度定义,属于严重的逻辑错误。 - 损失函数与输出层配置不匹配
你当前输出层为Dense(1)+sigmoid,属于二分类任务配置,但搭配的损失函数categorical_crossentropy要求标签为独热编码格式,且输出层维度等于分类类别数。如果你做的是多分类种族识别:- 若标签为整数编码,输出层改为
Dense(类别数, activation='softmax'),损失函数替换为sparse_categorical_crossentropy - 若为二分类任务,损失函数直接替换为
binary_crossentropy即可
- 若标签为整数编码,输出层改为
修复后参考代码
import numpy as np from keras.models import Sequential from keras.layers import Conv2D, Activation, MaxPooling2D, Flatten, Dense # 原有数据加载逻辑 pickle_in = open("X.pickle", "rb") X = pickle.load(pickle_in) pickle_in.close() pickle_in = open("y.pickle", "rb") y = pickle.load(pickle_in) pickle_in.close() X = X/255.0 # 将y转为numpy数组 y = np.array(y) # 此处替换为你的实际种族分类数量 CLASS_NUM = 5 # 模型构建 仅实例化一次Sequential model = Sequential() model.add(Conv2D(64, (3, 3), input_shape = X.shape[1:])) model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Conv2D(64, (3, 3))) model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Flatten()) model.add(Dense(64, activation='relu')) # 多分类输出层配置 model.add(Dense(CLASS_NUM, activation='softmax')) # 若为二分类任务,替换为下方输出层配置 # model.add(Dense(1, activation='sigmoid')) model.compile( # 多分类整数标签用该损失函数 loss='sparse_categorical_crossentropy', # 二分类任务替换为下方损失函数 # loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'] ) model.fit(X, y, batch_size=32, epochs=10)
内容的提问来源于stack exchange,提问作者Scott
相关产品推荐
相关产品推荐

