在我的应用程序中,我使用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__())
答案 0 :(得分:0)
如果其他人遇到相同的问题,解决方案是在tf.gradients()中将gate_gradients标志设置为True。使用此方法,您在计算梯度以及将梯度应用于优化器时会失去并行性和性能,但会获得可重复性。