Keras训练16×16灰度图回归模型时输入张量不匹配报错如何解决
报错根因
你当前使用的全连接Dense网络,第一层要求每个输入样本是长度为256的一维向量,但你传入的trainX是形状为(样本数, 16, 16)的三维数组,每个样本是16*16的二维灰度矩阵,维度完全不匹配:
- 第一次报错是框架误将每个样本的16行16列数据识别为独立的输入张量,所以提示收到了1700个输入张量
- 第二次报错是你新增了通道维度后,输入形状变为
(None, 16, 16, 1),最后一维长度和全连接层要求的256不一致,触发维度不兼容错误
最小改动解决方法(适配现有全连接模型)
无需新增通道维度,直接将所有图像数据做扁平化处理,把每个16*16的二维图像压成256维的一维向量即可:
# 处理训练集和测试集的输入维度 trainX = trainX.reshape(trainX.shape[0], 16 * 16) testX = testX.reshape(testX.shape[0], 16 * 16)
调整完成后再调用model.fit即可正常启动训练。
可选优化方案(改用CNN更适配图像任务)
如果后续想要提升回归精度,推荐使用适配二维图像输入的卷积神经网络,不需要提前做扁平化操作,示例代码如下:
# 先给图像加灰度通道维度 trainX = np.expand_dims(trainX, -1) testX = np.expand_dims(testX, -1) # 构建CNN模型 model = models.Sequential() model.add(layers.Conv2D(32, (3,3), activation='relu', input_shape=(16,16,1))) model.add(layers.MaxPooling2D((2,2))) model.add(layers.Conv2D(64, (2,2), activation='relu')) model.add(layers.Flatten()) model.add(layers.Dense(64, activation='relu')) model.add(layers.Dense(1, activation='linear')) # 编译训练 model.compile(optimizer='adam', loss='mean_squared_error', metrics=['mae']) history = model.fit(trainX, trainY, epochs=50, validation_split=.2, batch_size=128,verbose=1)
内容的提问来源于stack exchange,提问作者rayan
相关产品推荐
相关产品推荐

