微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Tensorflow - 在使用 CrossEntropy 损失训练鉴别器模型时 NaN 或接近零损失

如何解决Tensorflow - 在使用 CrossEntropy 损失训练鉴别器模型时 NaN 或接近零损失

我正在尝试实现一个模型,该模型将输入作为 (q,a) 对,其中 q 是问题,a 是答案,并且 q 和 a 都是位置编码的。输出将是基于给定问题的答案的真实程度。所以这归结为一个二元分类任务,其中输出介于 0(假)和 1(真实)之间。

我的模型如下所示:

Model Summary

我接受两个输入,将它们连接起来,通过 RNN 传递,然后使用 sigmoid 来获得概率。 我将每个训练步骤定义为:

cross_entropy = tf.keras.losses.BinaryCrossentropy(from_logits=True)
optimizer = tf.keras.optimizers.Adam(1e-2)

@tf.function
def train_step(ip,tg,label):
    with tf.GradientTape() as tape:
        out = model([ip,tg])
        loss = cross_entropy(label,out)
        print(label,out)
        
    gradients = tape.gradient(loss,model.trainable_variables)
    optimizer.apply_gradients(zip(gradients,model.trainable_variables))
    return loss    

并使用

调用每个批次的步骤
for epoch in range(epochs):
        print("Epoch: %s"%(epoch + 1))
        batch_loss = 0.0
        
        for batch,((ip,tg),label) in enumerate(concat_dataset.take(steps_per_epoch)):
            loss = train_step(ip,label)
            batch_loss += loss
        

其中 ip,tg 是 (q,a) 对,标签为 0 或 1 表示假或真 (q,a) 样本。 当我训练模型时,我不断得到 NaN 或损失小到 1e-20 我无法弄清楚这里出了什么问题。我认为它要么是梯度爆炸,要么是梯度下降,我尝试降低和增加亚当的学习率。我也使用了 SGD,但结果相同。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。