TensorFlow构建11类天气图像分类神经网络时出现形状不匹配错误求助
看起来你遇到的是张量形状不匹配的问题,错误提示里的Reshape节点报错,说明数据集的维度顺序和模型预期的对不上,我们一步步来解决:
核心问题分析
你的输入数据X_train是(12288, 1080)的格式(特征数在前,样本数在后),但TensorFlow的tf.data.Dataset默认是按单个样本为单位处理的,也就是每个元素应该是(特征数,)的形状,batch之后是(batch_size, 特征数)。而你当前的数据集构建方式,会让minibatch的维度完全反过来,导致后续的reshape/运算出现形状冲突。
具体修复步骤
调整数据集的维度顺序
在构建Dataset之前,先把训练集和测试集的特征、标签都转置,把样本数放到第一维度:# 转置训练集:从(特征数, 样本数)转为(样本数, 特征数) X_train = tf.transpose(X_train) Y_train = tf.transpose(Y_train) # 测试集同理 X_test = tf.transpose(X_test) Y_test = tf.transpose(Y_test)修正前向传播的输入维度
调整维度后,minibatch_X的形状已经是(minibatch_size, 12288),不需要再转置了,把前向传播的调用改成:Z3 = forward_propagation(minibatch_X, parameters)修正损失计算和准确率更新的输入
现在Z3(logits)的形状是(minibatch_size, 11),minibatch_Y的形状也是(minibatch_size, 11),所以:- 损失计算:把
compute_total_loss(Z3, tf.transpose(minibatch_Y))改成compute_total_loss(Z3, minibatch_Y) - 准确率更新:把
train_accuracy.update_state(minibatch_Y, tf.transpose(Z3))改成train_accuracy.update_state(minibatch_Y, Z3) - 测试集的准确率更新同理,去掉
tf.transpose(Z3)
- 损失计算:把
检查参数初始化的维度是否匹配11类
你的函数注释里原来写的是6类,但实际是11类,要确保initialize_parameters里最后一层的W3形状是(11, 上一层神经元数),b3是(11, 1),如果这里还是按6类初始化的话,也会导致形状不匹配的问题。
额外提示
你可以在构建Dataset后,打印一下minibatch的形状来验证:
for (minibatch_X, minibatch_Y) in minibatches: print(minibatch_X.shape, minibatch_Y.shape) break
正常应该输出(32, 12288) (32, 11)这样的结果。
按照这些步骤调整后,应该能解决当前的形状不匹配错误,如果还有问题,可以再检查forward_propagation里的矩阵运算维度是否对应哦。
备注:内容来源于stack exchange,提问作者Ayoub

