参考: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'即可运行,但是理论上应该还存在问题。