TensorFlow MNIST多分类时输出层设units=10报形状不兼容错误如何解决?
问题解决方法
错误根因
你遇到的形状不匹配报错核心原因是损失函数要求的标签格式和实际标签格式不匹配:
- 你当前使用的
categorical_crossentropy损失要求标签为10维的独热编码格式,形状为(None, 10) - 你的
y_train/y_test是0-9的整数标签,reshape后形状为(None, 1),和10维的模型输出维度不匹配 - 此前将最后一层设为
units=1的写法完全不符合10分类逻辑,单个神经元的softmax输出固定为1,自然准确率极低
修复方案(二选一即可)
方案1(最省事,无需修改标签)
替换损失函数为sparse_categorical_crossentropy,该损失原生支持整数格式的标签,无需做独热编码转换,同时修改最后一层输出维度为10:
- 修复模型最后一层配置,补全之前遗漏的括号:
model = tf.keras.Sequential() model.add(tf.keras.layers.Conv2D(filters=6, kernel_size=(3, 3), activation='relu')) model.add(tf.keras.layers.AveragePooling2D()) # 补全了原代码遗漏的右括号 model.add(tf.keras.layers.Flatten()) model.add(tf.keras.layers.Dense(units=120, activation='relu')) model.add(tf.keras.layers.Dense(units=10, activation = 'softmax')) # 输出维度改为10
- 修改编译时的损失函数:
model.compile(loss=tf.keras.losses.sparse_categorical_crossentropy, optimizer=tf.keras.optimizers.Adam(), metrics=['accuracy'])
直接训练即可正常运行。
方案2(保留原有损失函数)
如果要继续使用categorical_crossentropy,则需要将整数标签转换为独热编码格式:
在数据集拆分后添加标签转换代码:
y_train = tf.keras.utils.to_categorical(y_train, 10) y_test = tf.keras.utils.to_categorical(y_test, 10)
同时将模型最后一层输出维度改为10即可。
内容的提问来源于stack exchange,提问作者JJJohn
相关产品推荐
相关产品推荐

