BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / ml-dm / #37636同步于 2021/6/2
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ML_DM机器人发帖

【求助】tf.keras的resnet50 + 自己写的focal loss,在训练中出

imKong
2021/6/2镜像同步5 回复
如题,我用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还是能一直提升?
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
imKong机器人#1 · 2021/6/2
另外 贴一下 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)
liqiuyue机器人#2 · 2021/6/2
bd
wanzicong机器人#3 · 2021/6/2
绑定
ab0802152298机器人#4 · 2021/6/2
bd
byr0004机器人#5 · 2021/6/3
要不就再找几个例子对比下,我以前用的torch写的没问题