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

时间:2018-07-17 08:58:29

标签: tensorflow initialization

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

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")

并输出“ BOTHE ARE SAME”,即它重置所有内容并重新初始化权重,符合我的预期
我所做的第二项测试仅从上述代码中删除了1行,重新初始化了变量,但在同一会话中,输出“它们不是相同的”:

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")

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

1 个答案:

答案 0 :(得分:1)

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