Python 3.x 计算损失时的Keras Nan值

Python 3.x 计算损失时的Keras Nan值,python-3.x,keras,tensorflow2.0,Python 3.x,Keras,Tensorflow2.0,我的问题是关于 我正在努力实现文章中描述的方法。最后使用的算法如下(见第6页): d是向量单位 xhi是一个非空数 D是损失函数(在我的例子中是稀疏交叉熵) 其想法是进行对抗性训练,按照网络对微小变化最敏感的方向修改数据,并使用修改后的数据对网络进行训练,但标签与原始数据相同 用于训练模型的损失函数如下: l是标记数据上的损失度量 Rvadv是算法1图片中渐变内的值 文章选择alpha=1 其思想是将标记数据集的模型性能纳入损失中 我试图用MNIST数据集和一小批100个数据在Ker

我的问题是关于

我正在努力实现文章中描述的方法。最后使用的算法如下(见第6页):

  • d是向量单位
  • xhi是一个非空数
  • D是损失函数(在我的例子中是稀疏交叉熵)
其想法是进行对抗性训练,按照网络对微小变化最敏感的方向修改数据,并使用修改后的数据对网络进行训练,但标签与原始数据相同

用于训练模型的损失函数如下:

  • l是标记数据上的损失度量
  • Rvadv是算法1图片中渐变内的值
  • 文章选择alpha=1
其思想是将标记数据集的模型性能纳入损失中

我试图用MNIST数据集和一小批100个数据在Keras中实现这个方法。当我试图做最后的梯度下降来更新权重时,经过一些迭代之后,我得到了Nan值,我不知道为什么。我将笔记本张贴在协作会话上(I 不知道它能坚持多久,所以我也将代码发布在摘要中):

  • 协作会议:
  • 要点:

这是一种培训中的标准问题,我建议您阅读常见情况下的原因和解决方案

基本上,我只是做了以下两个更改,代码在渐变中没有
NaN
运行:

  • 降低优化器在
    模型中的学习率。将
    编译为
    优化器=tf.keras.optimizers.Adam(学习率=1e-3)

  • C=[loss(label,pred)for label,pred in zip(yBatchTrain,dumbModel(dataNoised,training=False))替换为
    C=loss(yBatchTrain,dumbModel(dataNoised,training=False))

  • 如果您仍然存在此类错误,那么接下来可以尝试的几件事是:

  • 剪辑损失或渐变
  • 将所有张量从
    tf.float32
    切换到
    tf.float64

  • 下次当您遇到此类错误时,您可以使用来查找
    NaN

    的根本原因再次感谢您,它很有效!我认为这个问题也与我的本地机器有关:collab工作得很好,但当我下载笔记本并执行它时,就会出现Nan值,我将自己调查,但谢谢!:D