python - TF.Keras SparseCategoricalCrossEntropy 在 GPU 上返回 nan
问题描述
试图在 GPU 上训练 UNet 以创建二进制分类图像。每个时期都有 nan 损失。损失函数的测试总是产生 nan-return。
测试用例:
import tensorflow as tf
import tensorflow.keras.losses as ls
true = [0.0, 1.0]
pred = [[0.1,0.9],[0.0,1.0]]
tt = tf.convert_to_tensor(true)
tp = tf.convert_to_tensor(pred)
l = ls.SparseCategoricalCrossentropy(from_logits = True)
ret = l(tt,tp)
print(ret) #tf.Tensor(nan, shape=(), dtype=float32)
如果我强制我的 tf 与 CPU 一起工作(带有 Tensorflow 后端的 Keras 是否可以随意使用 CPU 或 GPU?),一切正常。是的,我的 UNet 在 CPU 上适合并正确预测。
我检查了 keras GitHub 上的几篇文章,但都指向编译 ANN 的问题,例如对分类交叉熵使用不适当的优化器。
任何解决方法?我错过了什么吗?
解决方案
我遇到过同样的问题。如果我在 CPU 上进行训练,我的损失是一个实数。我尝试升级TF版本,但没有解决问题。我终于通过减少 y 维度解决了我的问题。我的模型输出是一个二维数组。当我把它减少到一维时,我设法在 GPU 上得到了真正的损失。
推荐阅读
- java - 无法在 Weblogic 上部署
- rxjs - Rxjs。嵌套条件 observable 暂停“main” observable
- regex - 我试图在我的正则表达式中只选择 `<` 和 `-` 之间的内容
- asp.net-core - 错误的 appsettings 值在调试时进入 ConfigurationBuilder 对象
- python - 如何将 DateTime 对象与整数进行比较?
- python - 如果提交已经完成,你如何推送 pycharm?
- javascript - 验证在 Jquery 和 rails 中选择的复选框的长度
- android - 在没有 Google Play 的情况下更新 Android 应用程序
- java - 以整数计算的双精度表达式
- java - android上发布版本中的对象反序列化