创建新会话如何影响TensorFlow中变量的初始化



我有一个非常简单的图,其中有一个完全连接的层,如下所示:

X = tf.placeholder(tf.float32, shape=[None, 2])
y = tf.placeholder(tf.float32, shape=[None,])
with tf.variable_scope("FC"): 
logits = tf.contrib.layers.fully_connected(X, 1, activation_fn = tf.nn.tanh, scope='myFC', weights_initializer=tf.contrib.layers.xavier_initializer(seed=10))
loss_tf = tf.reduce_mean(tf.square(logits - y))
opt = tf.train.GradientDescentOptimizer(learning_rate = 0.001)
updates_tf = opt.minimize(loss_tf)

我的目标是测试种子是如何工作的,因此我在完全连接层的xavier初始化器中添加了一个种子。我用两种不同的方法对此进行了测试:
第一种方法如下:

data, labels = prepData()
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())   
oldLosses = []
for epoch in range(0, 2):
_, loss = sess.run([updates_tf, loss_tf], {X: data.T, y: labels})
oldLosses.append(loss)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())   
newLosses = []
for epoch in range(0, 2):
_, loss = sess.run([updates_tf, loss_tf], {X: data.T, y: labels})
newLosses.append(loss)
if oldLosses == newLosses:
print("BOTH ARE SAME")
else:
print("THEY ARE NOT THE SAME")

并且它输出"两者相同",即它重置所有内容并重新初始化权重,正如我所期望的
我做的第二个测试,从上面的代码中只删除了一行,重新初始化变量,但在同一会话中,输出"它们不一样":

data, labels = prepData()
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())   
oldLosses = []
for epoch in range(0, 2):
_, loss = sess.run([updates_tf, loss_tf], {X: data.T, y: labels})
oldLosses.append(loss)
sess.run(tf.global_variables_initializer())   
newLosses = []
for epoch in range(0, 2):
_, loss = sess.run([updates_tf, loss_tf], {X: data.T, y: labels})
newLosses.append(loss)
if oldLosses == newLosses:
print("BOTH ARE SAME")
else:
print("THEY ARE NOT THE SAME")

我想知道创建一个新会话会如何影响变量的初始化,或者还有其他我没有看到的事情吗?

好吧,我终于在本文档的第7-9页找到了问题的答案。基本上,对于这种情况,如果在操作符级别添加种子,即在初始值设定项的构造函数中添加,而不是在图级别添加(使用tf.set_random_seed(,则每个操作符都保留自己的种子。由于我们这里有一个操作员,在不创建新会话的情况下多次调用它不会改变。但是,如果我们创建一个新的会话,则会重新创建操作符,并且种子将是相同的,因此在随后的运行中结果将是相同。

最新更新