【tensorflow2.0】ValueError:A target array with shape was passed for an output of shape...问题解决

在 Jupyter notebook 用 tensorflow2.0 训练一个多分类模型时遇到报错

问题描述:

喂入的是 fashion_mnist 数据集,训练和测试的图片都经过了归一化,标签也都转为独热编码

模型建立的代码如下:

model = tf.keras.Sequential()
model.add(tf.keras.layers.Flatten(input_shape = (28, 28)))
model.add(tf.keras.layers.Dense(128, activation = 'relu'))
model.add(tf.keras.layers.Dense(10, activation = 'softmax'))

之前运行的时候是没有报错的,
后来我打算添加层,试一下网络拟合能力有没有提升,
于是在上面的代码下面简单粗暴地加了一行:

model.add(tf.keras.layers.Dense(128, activation = 'relu'))

之后进行模型装配,指定损失函数为分类交叉熵

model.compile(optimizer = tf.keras.optimizers.Adam(learning_rate = 0.01),
              loss = 'categorical_crossentropy',
              metrics = ['acc'])

传入数据进行训练的时候就遇到报错:

model.fit(train_image, train_label_onehot, epochs = 5)

报错信息如下:

...
ValueError: A target array with shape (60000, 10) was passed for an output of shape (None, 128)
while using as loss `categorical_crossentropy`. 
This loss expects targets to have the same shape as the output.

报错原因分析:

添加网络层的时候没有修改输出神经元的个数
将标签转为独热编码之后label.shape由 (60000, ) 变为 (60000, 10)
因此对应的输出的应该是10个神经元

问题解决:

128 改为10

model.add(tf.keras.layers.Dense(10, activation = 'relu'))

总结:

其实不应该这么直接修改网络层,
softmax层应置于最后一层。

在修改网络结构的时候要注意输出神经元的修改,
从第二层开始,
输入神经元由机器自动判断不用自己定义,
但输出神经元还是要自己判断。

  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不雨_亦潇潇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值