张量流打印重塑结果会产生不一致的结果

时间:2018-05-12 16:56:19

标签: tensorflow

我试图在压平一些尺寸后打印随机张量和张量。在扁平张量中,我无法看到与原始张量相同的数字。为什么会出现这种情况。也许我没有按照应该使用的方式使用张量流图。但这非常不显眼。在这种情况下,幕后发生了什么。

tf.reset_default_graph()
init_op = tf.initialize_all_variables()
tf.set_random_seed(1)
a_cC = tf.random_normal([1, 4, 4, 3], mean=1, stddev=4)
a_C_unrolled = tf.reshape(a_cC,[n_H*n_W,-1])
m, n_H, n_W, n_C = a_cC.get_shape().as_list()
#run the graph
with tf.Session() as sess:
    sess.run(init_op) #execute init_op
    #print the random values that we sample
    print (a_cC.eval())
    print(a_C_unrolled.eval())

[[[[ 5.21173716 -2.57399869  2.2410903 ]
   [ 5.91965914 -1.51706624  3.2767477 ]
   [-5.43970776  5.40671778 -2.23373938]
   [ 1.30087972 -3.63979769  4.04065228]]

  [[-0.60225141 -3.67490149 -2.65537524]
   [-0.46801746  8.29556847 -3.72800827]
   [ 3.0645113  -2.69916749  0.62769747]
   [-1.20489335  5.94129944 -3.44496584]]

  [[ 0.767515    3.72639561  3.76502395]
   [-2.08509254  0.56502891  4.45876408]
   [-4.26457405  2.33417678 -5.8700161 ]
   [ 1.68790722 -3.15862226  5.4228363 ]]

  [[-3.76462507  5.20460367  1.7311039 ]
   [ 5.35282135 -1.88765669  0.5600276 ]
   [ 7.26085281 -0.41734922 -3.47196579]
   [ 2.3799715   3.59994555 -5.574862  ]]]]
[[  4.17360973   2.97644758   1.60952783]
 [  2.36316919   4.27825832   0.35627228]
 [ -1.93402743  -0.77855718   1.19499707]
 [  9.27605629  -0.14986098  -4.86341763]
 [  2.68826199  -2.93058538   2.61971998]
 [ -3.33843374   8.2380991    2.73879862]
 [  2.23551083   8.69216537  -1.86058855]
 [ -0.06427336   4.50859356   1.98980188]
 [  1.19318628   1.28395951  -4.21570063]
 [ -3.17614985   4.91742516  10.99014568]
 [ -4.52236128   0.07621473  -4.08683443]
 [ -5.08178997  11.00571442  -1.07105398]
 [  2.51096773   4.26725626   7.13943052]
 [  2.7490077   -1.21482229   3.5335772 ]
 [  3.64062643   7.32875776   2.80212164]
 [  4.00615311   0.83125246  -3.00467968]]

1 个答案:

答案 0 :(得分:1)

张量不保持状态,这与变量不同。 Variables可以表示共享的持久状态。因此,每次运行操作或评估张量时,图中的张量(常量)都会重新开始。在您的情况下,由于您的a_cC来自tf.random_normal(没有固定的种子),因此您在两个单独的命令(a_cC或{中评估a_C_unrolledsess.run {1}}),基础.eval()将是不同的。为了使您的工作按照您想要的方式进行,您需要在一个a_cC中对它们进行评估。然后他们的价值观将保持一致并“得到确认”。现在您可以单独或一起打印出来。

sess.run

编辑with tf.Session() as sess: sess.run(init_op) #execute init_op #print the random values that we sample a_cC_val, a_C_unrolled_val = sess.run((a_cC, a_C_unrolled)) print(a_cC_val) print(a_C_unrolled_val)

我认为Variable状态与会话无关。 Instead

  

在内部,tf.Variable存储持久张量。特定的ops允许您读取和修改此张量的值。这些修改在多个tf.Sessions 中可见 ,因此多个工作人员可以看到tf.Variable的相同值。

编辑Variable vs eval()

tf.Tensor documentation

中所述
  
      
  1. 在会话中启动图形后,可以通过将Tensor传递给tf.Session.run来计算Tensor的值。 t.eval()是调用tf.get_default_session()。run(t)的快捷方式。
  2.   

编辑随机种子

首先,您可能知道,您需要重置种子,以便从连续的呼叫中获得相同的数字/序列。

其次,如tf.set_random_seed documentation中所述:

  

依赖随机种子的操作实际上是从两个种子派生出来的:图级和操作级种子。这将设置图级别种子。

     

它与操作级别种子的交互如下:

     
      
  1. 如果既未设置图表级别也未设置操作种子:此操作使用随机种子。
  2.   
  3. 如果设置了图级别种子,但操作种子不是:系统确定性地选择一个操作种子与图级种子一起使用,以便它获得一个唯一的随机序列。
  4.   
  5. 如果未设置图级种子,但设置了操作种子:使用默认的图级种子和指定的操作种子来确定随机序列。
  6.   
  7. 如果同时设置了图级和操作种子:两个种子一起用于确定随机序列。
  8.   

你的案子是#2。确实系统会为您选择一个操作种子。但是如果没有定义的操作种子,你的两个连续调用会给你两个不同的东西,即使每次运行整个代码时这两个不同的东西总是相同的。

把它放在一起,我认为你需要有以下内容才能保持一致sess.run()a_cC

a_C_unrolled