模型训练报错:ValueError: logits and labels must have the same shape ((150, 17) vs (150, 1))

参考:https://stackoverflow.com/questions/60593469/logits-and-labels-must-have-the-same-shape-294-6-vs-6-1

输出层和损失函数:

    # # FC层和softmax层              softmax   sigmoid
    outputs = tf.keras.layers.Dense(classification,activation='sigmoid')(x)       

    model_def = tf.keras.Model(inputs=inputs, outputs=outputs)

    # 编译模型,确定优化方法,损失函数等
    # https://blog.csdn.net/qq_34418352/article/details/106341446
    # loss='categorical_crossentropy'主要用在二分类问题上,将标签以one_hot的形式呈现,涉及到两个或者更多个标签类别的时候使用该损失函数
    # loss='sparse_categorical_crossentropy'将标签表示为整数类型
    # loss='binary_crossentropy'  loss=tf.keras.losses.binary_crossentropy 处理二分类问题时使用该交叉熵损失    与sigmoid搭配使用
    # 多标签分类    loss=tf.losses.binary_crossentropy
    #             loss = tf.keras.losses.binary_crossentropy()('y_true','y_pred')
    #               loss = tf.nn.sigmoid_cross_entropy_with_logits
    # loss_func = tf.nn.sigmoid_cross_entropy_with_logits()
    model_def.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) 

报错:

ValueError: logits and labels must have the same shape ((150, 17) vs (150, 1))

原因:
1、二分类和多标签分类,最后一层使用sigmoid,损失函数使用loss='binary_crossentropy'时,标签需为one_hot形式
(loss='categorical_crossentropy'时,标签也应为one_hot形式)

2、多分类,最后一层使用softmax,损失函数使用loss='sparse_categorical_crossentropy'时,标签需为[0,2,6,3,...,4,7,0]形式

3、上述报错,将loss改为'sparse_categorical_crossentropy'即可运行,但是理论上应该还存在问题。

你可能感兴趣的:(模型训练报错:ValueError: logits and labels must have the same shape ((150, 17) vs (150, 1)))