【问题标题】:Tensorflow: Determinism of AdamOptimizer when running in CPUTensorflow:在 CPU 中运行时 AdamOptimizer 的确定性
【发布时间】:2018-11-05 20:58:33
【问题描述】:

在我的应用程序中,我使用 apply_gradient() 和 AdamOptimizer 优化神经网络。我注意到每次运行我的应用程序时都无法准确地重现结果,并且需要它来比较结果。在搜索类似问题时,我注意到 Tensorflow 在 GPU 中运行时会遇到不确定性问题,但我的问题即使在 CPU 中也会出现。

我简化了我的代码,我认为问题出在 apply_gradients,但我不确定,因为我没有使用 tensorflow 的经验。以下代码使用随机数据(当然使用正确播种的 numpy)训练神经网络,并将网络的参数写入日志文件。如果您运行该程序两次,您会注意到程序的不同运行之间的网络参数存在显着差异,即使训练数据相同。

我使用 TensorFlow 1.11.0

为什么会这样?可能是由于算术精度错误还是我做错了什么?

import tensorflow as tf
import numpy as np
import logging
import sys
import math
import datetime

if __name__ == '__main__':

    # Just configure logging
    logging.basicConfig(filename='example.log', filemode='w', level=logging.DEBUG)
    logging.debug('Python version: %s', sys.version)
    logging.debug('Tensorflow version: %s', tf.__version__)
    logging.debug('Date time: %s', datetime.datetime.now())

    # Seed everything
    randomseed = 999
    np.random.seed(randomseed)
    tf.set_random_seed(randomseed)

    # Create a Neural Network
    inputs = tf.placeholder(tf.float64, [None, 10])
    hidden_dims = [100, 200]
    net = inputs
    for dim in hidden_dims:
        weight_initializer = tf.initializers.random_uniform(minval= - 1 / math.sqrt(10), maxval = 1 / math.sqrt(10))
        net = tf.layers.dense(inputs=net, units=dim, kernel_initializer=weight_initializer, bias_initializer=weight_initializer)
        net = tf.layers.batch_normalization(inputs=net)
        net = tf.nn.relu(net)
    weight_initializer = tf.initializers.random_uniform(minval=-3e-3, maxval=3e-3)
    net = tf.layers.dense(inputs=net, units=20, kernel_initializer= weight_initializer, bias_initializer= weight_initializer)
    out = tf.nn.tanh(net)
    net_params = tf.trainable_variables()

    # Define some gradient ops
    grad = tf.gradients(out, net_params)
    gradients = list(map(lambda x: tf.div(x, 10), grad))
    optimizer = tf.train.AdamOptimizer(learning_rate=1e-4).apply_gradients(zip(gradients, net_params))

    with tf.Session() as sess:

        sess.run(tf.global_variables_initializer())
        for i in range(100):
             random_input = np.random.rand(10, 10)
             logging.debug('random_input: %s', random_input.__str__())

             sess.run(optimizer, feed_dict={inputs: random_input})
             params = sess.run(net_params)
             logging.debug('params: %d' + params.__str__())

【问题讨论】:

    标签: python tensorflow


    【解决方案1】:

    如果其他人遇到同样的问题,解决方案是在 tf.gradients() 中将 gate_gradients 标志设置为 True。使用它会在计算和将梯度应用到优化器期间失去并行性和性能,但会获得可重复性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-23
      • 2016-10-06
      相关资源
      最近更新 更多