valueerror: shapes (none, 1) and (none, 6) are incompatible

我在实验使用tensorflow实现图片分类,试图训练一个VGG19模型。

vgg = tf.keras.applications.VGG19(weights='imagenet', include_top=False, pooling='max')
vgg.trainable = False
tf_vgg_model = tf.keras.Sequential([
    vgg,
    tf.keras.layers.Dense(6)
])
tf_vgg_model.build(input_shape=(None, IMG_HEIGHT, IMG_WIDTH, 3))
tf_vgg_model.summary()
early_stopping = tf.keras.callbacks.EarlyStopping(
    monitor='val_loss',
    patience=3,
    min_delta=0.001
)
tf_vgg_model.compile(optimizer=tf.keras.optimizers.Adam(lr=0.001),
               loss=tf.keras.losses.CategoricalCrossentropy(from_logits=True),
               metrics=['accuracy'])
# 训练模型
history = tf_vgg_model.fit(data_train, validation_data=data_val,
                           batch_size=BATCH_SIZE, validation_freq=1,
                           epochs=EPOCHS, callbacks=[early_stopping])

但训练模型的过程中,遇到了一个错误:
ValueError: Shapes (None, 1) and (None, 50) are incompatible
开始我以为是数据某个地方设置错了,导致形状不兼容。但是反复查看了数据处理的代码,并没有发现存在问题。最后发现实际上是因为compile中的loss参数设置错误。

tf_vgg_model.compile(optimizer=tf.keras.optimizers.Adam(lr=0.001),
               loss=tf.keras.losses.CategoricalCrossentropy(from_logits=True),
               metrics=['accuracy'])

由于我的label目标是数字编码,因此只需将tf.keras.losses.CategoricalCrossentropy更改为tf.keras.losses.SparseCategoricalCrossentropy:

tf_vgg_model.compile(optimizer=tf.keras.optimizers.Adam(lr=0.001),
               loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
               metrics=['accuracy'])

此错误的原因是CategoricalCrossentropy是适用于目标是 one-hot 编码,而SparseCategoricalCrossentropy才是适用于数字编码目标。

  • 47
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值