如何为Keras神经网络的NumPy维度分配单个标签
问题根源分析
- 首先是输入数据维度顺序错误:Keras/TensorFlow默认所有输入数组的第0维是样本数,你当前
datax形状为(560, 560, 32086),系统会误以为你只有560个样本,每个样本形状为(560, 32086);而你的标签datay形状是(1,1,32086),系统识别到的样本数是1,两者样本数不匹配才会报错。 - 其次是网络结构和任务不匹配:你做的是单图像级二分类,当前用Conv1D、输出层神经元数和损失函数的搭配也存在不合理的地方。
解决步骤
1. 调整输入和标签的维度顺序
把样本数调整到第0维,和Keras的默认要求对齐:
import numpy as np # 调整输入数据维度:从(高,宽,样本数) 转成 (样本数,高,宽) datax = datax.transpose(2,0,1) # 调整标签维度:从(1,1,样本数) 转成 (样本数,) datay = datay.reshape(-1)
调整后datax的形状为(32086, 560, 560),datay的形状为(32086,),两者样本数完全匹配,不会再出现基数不匹配的报错。
2. 修正网络结构
你处理的是2维图像,建议用Conv2D而非Conv1D,同时输出层适配二分类任务:
# 给单通道图像增加通道维度,适配卷积层输入要求 datax = datax[..., np.newaxis] model = Sequential( [ Rescaling(1.0 / 255, input_shape=(560,560,1)), Conv2D(32, (3,3), activation="relu"), GlobalAveragePooling2D(), # 把二维特征压缩为一维特征,避免后续参数量过大 Dense(750, activation='relu'), Dense(1, activation='sigmoid') # 二分类用1个sigmoid输出即可 ] ) model.compile(optimizer=SGD(learning_rate=0.1), loss="binary_crossentropy", metrics=['accuracy']) model1 = model.fit(x=datax, y=datay, batch_size=8, epochs=15, shuffle=True, verbose=2)
如果确实要保留2个输出神经元的设置,请把输出层激活改为softmax,损失函数改为sparse_categorical_crossentropy即可。
可选优化
如果你的硬件显存足够,建议把batch_size调大到8、16等数值,相比batch_size=1训练效率会高很多,同时收敛也更稳定。
内容的提问来源于stack exchange,提问作者Kookies
相关产品推荐
相关产品推荐

