我的代码:
import numpy
numpy.set_printoptions(threshold=numpy.nan)
with tf.Session() as test_a:
box_confidence = tf.random_normal([3, 4, 5, 1], mean=1, stddev=4, seed = 1)
boxes = tf.random_normal([3,4, 5, 4], mean=1, stddev=4, seed = 1)
box_class_probs = tf.random_normal([3, 4, 5, 3], mean=1, stddev=4, seed = 1)
xxx = box_confidence * box_class_probs
aaa = K.argmax(xxx, axis=-1)
bbb = K.max(xxx, axis=-1, keepdims=False)
print(xxx.eval())
print(xxx.get_shape())
print(aaa.eval())
print(aaa.get_shape())
根据我的理解,aaa
采用最后一个维度xxx
的最大值索引(第四维中三个数字的最大数字)。
所以......鉴于张量值(用固定种子初始化),aaa
的第一行应该是0 2 0 2 0
,对吧?我从输出中得到的是1 1 1 2 1
。为什么呢?
答案 0 :(得分:2)
误解并非来自K.max()
或K.argmax()
,而是来自tensor.eval()
。
每次调用tensor.eval()
时,都会在图表中启动新的运行,因此每次伪随机定义的张量都会填充新值,因为随机种子也会递增(使用seed=1
{ {1}}没有修复这些值,它会修复每次运行时生成的伪随机值序列,详情请参阅doc。
换句话说,tf.random_normal()
,xxx.eval()
和aaa.eval()
会为您提供3种不同运行的结果,其中包含3种不同的随机值。
如果您一次评估bbb.eval()
,xxx
和aaa
,则会获得您期望的结果。
bbb