训练CNN时sparse_categorical_crossentropy相关警告的含义是什么?
警告含义说明
该警告的核心是你配置的损失函数参数和模型输出层的实际输出格式不匹配,具体对应两个矛盾的设置:
- 你定义
SparseCategoricalCrossentropy损失时设置了from_logits=True,这个参数的含义是告知TensorFlow,模型的输出是未经过softmax归一化的原始对数几率(logits)值,损失函数会在内部自动完成softmax计算,这种实现的数值稳定性更好。 - 但你的模型最后一层全连接层使用了
activation=tf.keras.activations.softmax,输出的是已经完成归一化的概率值,和损失函数的输入预期不符,因此触发了警告。
另外你还存在代码顺序错误的问题:你先调用了model2.compile方法,之后才定义model2 = Sequential(...)结构,当前写的编译配置完全不会作用到你定义的CNN模型上,需要调整代码顺序。
修复方案
你可以选择任意一种方案解决警告,注意两种方案的参数要对应:
- 方案1(更推荐):保持损失函数的
from_logits=True参数,删除最后一层的softmax激活,直接输出原始logits,该方案数值稳定性更高,能减少梯度消失/溢出的概率。 - 方案2:保持最后一层的softmax激活,把损失函数的
from_logits参数改为False。
调整后正确的代码顺序参考:
# 第一步:先定义模型结构 model2=Sequential([ layers.experimental.preprocessing.Rescaling(1./255, input_shape=(180,180,3)), layers.Conv2D(16, 3, padding='same', activation='relu'), layers.MaxPooling2D(), layers.Conv2D(32, 3, padding='same', activation='relu'), layers.MaxPooling2D(), layers.Conv2D(64, 3, padding='same', activation='relu'), layers.MaxPooling2D(), layers.Flatten(), layers.Dense(128,activation='relu'), # 方案1用以下这行 layers.Dense(9) # 方案2则替换为以下这行 # layers.Dense(9,activation=tf.keras.activations.softmax) ]) # 第二步:结构定义完成后再编译 model2.compile(optimizer='adam', # 方案1用以下这行 loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), # 方案2则替换为以下这行 # loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False), metrics=['accuracy'])
内容的提问来源于stack exchange,提问作者Hari Upadrasta
相关产品推荐
相关产品推荐

