You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TensorFlow多输出多分类模型使用SparseCategoricalCrossentropy报错求助

问题解决:多输出模型使用SparseCategoricalCrossentropy的类型转换错误

错误原因

你遇到的ValueError: Tensor conversion requested dtype float32 for Tensor with dtype int32,核心问题出在F1Score指标的配置上:

  • F1Score默认数据类型为float32,但稀疏分类任务的标签(int32类型)无法直接转换为该类型;
  • 多分类场景下,F1Score必须指定average参数(如'macro'、'micro'),否则无法正确计算;
  • 模型输出为logits,需要告知F1Score直接基于logits计算,无需提前转成概率。

修复方案

修改模型编译阶段的metrics配置,将字符串形式的'F1Score'替换为实例化的F1Score对象,明确指定参数:

model.compile(
    optimizer='adam',
    loss={
        'y': tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
        'gcd': tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
    },
    metrics={
        'y': 'accuracy',
        'gcd': tf.keras.metrics.F1Score(average='macro', dtype='int32', from_logits=True)
    }
)

参数说明

  • average='macro':对每个类别计算F1值后取平均,适合多分类任务,你也可以根据需求换成'micro'或'weighted';
  • dtype='int32':与稀疏标签的数据类型匹配,避免类型转换错误;
  • from_logits=True:告知指标模型输出是未经过softmax的logits,无需额外转换。

完整修复后代码

import numpy as np
import tensorflow as tf
from sklearn.preprocessing import OneHotEncoder

mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train / 255.0
x_test = x_test / 255.0
x_train = x_train.reshape(-1, 784)
x_test = x_test.reshape(-1, 784)

def get_gcd(i):
    if i == 0:
        return 0
    elif i == 1:
        return 1
    else:
        for j, k in enumerate([2, 3, 5, 7]):
            if i % k == 0:
                return j + 2
y_train_gcd = np.array([get_gcd(i) for i in y_train])
y_test_gcd = np.array([get_gcd(i) for i in y_test])

y_train = [y_train, y_train_gcd]
y_test = [y_test, y_test_gcd]

inp = tf.keras.Input(shape=(784,))
x = tf.keras.layers.Dense(128, activation='relu')(inp)
output_y = tf.keras.layers.Dense(10, name='y')(x)
output_gcd = tf.keras.layers.Dense(6, name='gcd')(x)
model = tf.keras.Model(inputs=inp, outputs=[output_y, output_gcd])
model.compile(
    optimizer='adam',
    loss={
        'y': tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
        'gcd': tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
    },
    metrics={
        'y': 'accuracy',
        'gcd': tf.keras.metrics.F1Score(average='macro', dtype='int32', from_logits=True)
    }
)
model.fit(x_train, y_train, epochs=10, batch_size=32, validation_data=(x_test, y_test)) 

内容的提问来源于stack exchange,提问作者nike01705

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 00:45:57