我试图在压平一些尺寸后打印随机张量和张量。在扁平张量中,我无法看到与原始张量相同的数字。为什么会出现这种情况。也许我没有按照应该使用的方式使用张量流图。但这非常不显眼。在这种情况下,幕后发生了什么。
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]]
答案 0 :(得分:1)
张量不保持状态,这与变量不同。 Variables可以表示共享的持久状态。因此,每次运行操作或评估张量时,图中的张量(常量)都会重新开始。在您的情况下,由于您的a_cC
来自tf.random_normal
(没有固定的种子),因此您在两个单独的命令(a_cC
或{中评估a_C_unrolled
和sess.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()
- 在会话中启动图形后,可以通过将Tensor传递给tf.Session.run来计算Tensor的值。 t.eval()是调用tf.get_default_session()。run(t)的快捷方式。
醇>
首先,您可能知道,您需要重置种子,以便从连续的呼叫中获得相同的数字/序列。
其次,如tf.set_random_seed
documentation中所述:
依赖随机种子的操作实际上是从两个种子派生出来的:图级和操作级种子。这将设置图级别种子。
它与操作级别种子的交互如下:
- 如果既未设置图表级别也未设置操作种子:此操作使用随机种子。
- 如果设置了图级别种子,但操作种子不是:系统确定性地选择一个操作种子与图级种子一起使用,以便它获得一个唯一的随机序列。
- 如果未设置图级种子,但设置了操作种子:使用默认的图级种子和指定的操作种子来确定随机序列。
- 如果同时设置了图级和操作种子:两个种子一起用于确定随机序列。
醇>
你的案子是#2。确实系统会为您选择一个操作种子。但是如果没有定义的操作种子,你的两个连续调用会给你两个不同的东西,即使每次运行整个代码时这两个不同的东西总是相同的。
把它放在一起,我认为你需要有以下内容才能保持一致sess.run()
和a_cC
:
a_C_unrolled