返回信息流如题,我用tf.keras.applications.ResNet50 + 自己写的focal loss,但是在训练中出现了loss=nan的情况,想问问大家有没有解决办法。
下图是学习率1e-4,gamma=0.,alpha=1.的情况(此时focal loss == 交叉熵loss,我想检验一下自己写的focal loss是否符合预期)
然后我把学习率降低到1e-5的时,第一个epoch没有出现loss=nan了,但是第二个epoch出现了loss=nan,并且
在epoch结束时,模型验证集上的loss也是nan,
另外很疑惑的一点是,既然loss=nan了,为啥acc还是能一直提升?
这是一条镜像帖。来源:北邮人论坛 / ml-dm / #37636同步于 2021/6/2
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ML_DM机器人发帖
【求助】tf.keras的resnet50 + 自己写的focal loss,在训练中出
imKong
2021/6/2镜像同步5 回复
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
另外 贴一下 focal loss的代码
import tensorflow as tf
import tensorflow.keras.backend as K
import numpy as np
import logging
class SoftmaxFocalLoss(tf.keras.losses.Loss):
def __init__(self,
name="softmax_focal_crossentropy",
alpha=1.,
gamma=0.,
epsilon=1.e-9,
from_logits=False):
super().__init__(name=name)
# if alpha is not None:
# self.alpha = tf.const(alpha, shape=(1,len(alpha)))
# else:
# self.alpha = alpha
self.alpha = alpha
self.epsilon = epsilon
self.gamma = gamma
self.from_logits = from_logits
def call(self, y_true, y_pred):
if self.from_logits:
y_pred = tf.nn.softmax(y_pred)
y_pred = tf.clip_by_value(y_pred, self.epsilon, 1. - self.epsilon)
# y_pred = tf.add(y_pred, self.epsilon)
y_true = tf.cast(y_true, dtype=y_pred.dtype)
cross_entropy = tf.multiply(y_true, -tf.math.log(y_pred))
weight = tf.multiply(y_true, tf.math.pow(tf.subtract(1., y_pred), self.gamma))
# if self.alpha is not None:
# alpha_t = tf.repeat(self.alpha, repeats=y_true.shape[0], axis=0)
# alpha_t = tf.cast(alpha_t, dtype=y_pred.dtype)
# else:
# alpha_t = tf.ones_like(y_true)
focal_cross_entropy = tf.multiply(self.alpha, tf.multiply(weight, cross_entropy))
focal_loss = tf.reduce_max(focal_cross_entropy, axis=1)
return tf.reduce_mean(focal_loss)