使用fit方法训练AlexNet时遇数据适配错误,请求协助解决
问题分析与解决方案
错误原因
你的模型编译时使用了CategoricalCrossentropy损失函数,该函数要求标签输入为one-hot编码的二维NumPy数组,但当前代码中y = [i[1] for i in data]得到的是嵌套列表结构(外层列表包含内层整数列表),Keras的数据适配器无法处理这种格式的标签输入,因此抛出错误。
具体解决方法
根据你的标签实际格式,选择对应方案:
方案1:标签为one-hot编码格式(如每个标签是[0,1,0,0]这类四元素列表)
修改train_model.py中标签处理代码,将嵌套列表转换为二维NumPy数组:
# 原代码 # y = [i[1] for i in data] # 修改为: y = np.array([i[1] for i in data])
转换后y会变成(样本数量, 4)形状的二维数组,完全符合CategoricalCrossentropy的输入要求。
方案2:标签为类别索引格式(如每个标签是[0]、[1]这类单元素列表)
需要同时修改标签格式和损失函数:
- 在
train_model.py中将标签转换为一维NumPy数组:
# 原代码 # y = [i[1] for i in data] # 修改为: y = np.array([i[1][0] for i in data]) # 提取子列表中的整数,生成一维数组
- 在
Model.py中替换损失函数为SparseCategoricalCrossentropy(专门适配整数类型的类别索引):
# 原代码 # loss=tf.keras.losses.CategoricalCrossentropy(), # 修改为: loss=tf.keras.losses.SparseCategoricalCrossentropy(),
验证步骤(可选)
修改前可以先打印标签的结构,确认格式:
print(y[0]) # 查看单个标签的形式 print(np.array(y).shape) # 查看标签整体的形状
内容的提问来源于stack exchange,提问作者Saswat Behera
相关产品推荐
相关产品推荐

