在 Tensorflow 中计算均方对数误差返回 nan

问题描述

我正在使用 tensorflow 训练自动编码器,并且入门代码提供了一种计算均方误差作为损失函数方法

self.mse_loss = tf.reduce_mean(tf.square(self.x - self.x_))

注意这里,self.x 是包含输入数据的张量(MNIST,有 784 个特征),self.x_ 是算法另一端的解码器的结果。

我想使用 MSE 来为输入参数找到一些最佳值(即在我正在研究的这个无监督问题中找到的集群数量),但 MSE 没有足够区分不同的运行来尝试肘部方法。相反,我认为我可以尝试不同的指标,例如均方对数误差。该指标的公式可以在 HERE 中找到。

最初我尝试了以下代码

self.msle_loss = tf.reduce_mean(tf.square(tf.log(1 + self.x) - tf.log(1 + self.x_ )))

但是,每当我运行它时,它都会返回 nan。我认为这与 tf.log() 无法处理零有关。

所以我尝试了一些产生价值的解决方案(我只是不确定哪个是最好的);

  1. 使用 tf.clip_by_value()
self.msle_loss = tf.reduce_mean(tf.square(tf.math.log(tf.clip_by_value(1 + self.x,1e-10,1e10)) - tf.math.log(tf.clip_by_value(1 + self.x_,1e10))))

这将运行并返回值,但我认为这是不正确的,因为它们非常大,大约。 240

  1. 添加一个小常量
self.msle_loss = tf.reduce_mean(tf.square(tf.log(1 + (self.x + 1e-4)) - tf.log(1 + (self.x_ + 1e-4))))

这会产生有效值,小于解决方案 1),大约。 12(因此小一个数量级)。这让我担心这两种方法不能互换,这就引出了一个问题,这里的正确方法是什么?当我最初遇到添加一个小常量的建议时,我的建议是添加一个小得多的常量 (1e-10),但我一直得到 nan,直到我将常量设置得足够大,如 1e-4。>

  1. 使用 tf.where() 我找到了一个旨在捕捉零的解决方案。
self.msle_loss = tf.reduce_mean(tf.square(tf.log(1. + tf.where(tf.equal(self.x,0.),tf.ones_like(self.x),self.x)) - tf.log(1.0 + tf.where(tf.equal(self.x_,tf.ones_like(self.x_),self.x_))))

但是我认为我没有正确实施它,因为我仍然使用这种方法获得了nan。

如果有人能够提出最好的方法而不会对我获得的价值产生偏见,我会非常感激。谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...