【问题标题】:How can I check in TensorFlow if any of my model variables is NaN?如果我的任何模型变量是 NaN,我如何检查 TensorFlow?
【发布时间】:2018-06-17 17:12:05
【问题描述】:

我的模型是:

weights = {
    'h1': tf.Variable(tf.random_normal([num_input, num_hidden_1]),name="h1"),
    'h2': tf.Variable(tf.random_normal([num_hidden_1, num_hidden_2]),name="h2"),
    'h3': tf.Variable(tf.random_normal([num_hidden_2, num_hidden_3]),name="h3"),
    'wout': tf.Variable(tf.random_normal([num_hidden_3, num_output]),name="wout")
}

biases = {
    'b1': tf.Variable(tf.random_normal([num_hidden_1]),name="b1"),
    'b2': tf.Variable(tf.random_normal([num_hidden_2]),name="b2"),
    'b3': tf.Variable(tf.random_normal([num_hidden_3]),name="b3"),
    'bout': tf.Variable(tf.random_normal([num_output]),name="bout")
}

我知道如何使用tf.is_nan 检查单个元素是否为 NaN:

def save_weights():
    if sess.run(tf.is_nan(sess.run(weights["h1"]).tolist()[0][0])):
        utils.printflush("weights have nan, refused to save")

当然,我可以遍历 Python 中的所有元素,但是对于一百万个权重和偏差,这很耗时。是否有 TensorFlow 操作可以做到这一点(迭代我所有的模型变量)?

【问题讨论】:

    标签: python loops tensorflow nan


    【解决方案1】:

    您可以使用tf.reduce_any 检查张量的至少一个元素是否不为零。

    另一方面,您可能想查看tf.verify_tensor_all_finite,如果在张量上找到 NaN 或无限值,这将中断执行(阅读tf.Assert 的文档以了解如何在图表上使用断言)。

    无论如何,请记住所有这些函数(包括tf.is_nan)都会在图中创建新操作。最好首先创建所有操作,然后根据需要调用run,以确保您的图形不会在每次运行时不必要地增长。

    【讨论】:

    • 谢谢,这帮助很大。如果认为自己使用 tf.reduce_sum 如果任何元素是 NaN 则应该返回 NaN 但不确定这是否合法。很遗憾tf.verify_tensor_all_finite 是一个断言,因为处理断言似乎很复杂。尽管如此,我还是会研究断言,因为我想不惜一切代价避免保存损坏的模型。
    猜你喜欢
    • 2019-07-16
    • 1970-01-01
    • 2019-10-15
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-15
    • 1970-01-01
    相关资源
    最近更新 更多