Недопонимание происходит не от K.max()
или K.argmax()
, а от tensor.eval()
.
Каждый раз, когда вы вызываете tensor.eval()
, вы запускаете новый прогон по графику, поэтому каждый раз, когда ваш псевдо- случайно определенные тензоры заполняются новыми значениями, так как их случайные начальные числа также увеличиваются (использование seed=1
для tf.random_normal()
не фиксирует значения, оно фиксирует последовательность псевдослучайных значений, которые будут генерироваться при каждом запуске, см. doc для деталей).
Другими словами, xxx.eval()
, aaa.eval()
и bbb.eval()
дают результаты для 3 различных прогонов с 3 различными случайными значениями ниже.
Если вы оцениваете xxx
, aaa
и bbb
одновременно за один прогон (test_a.run([xxx, aaa, bbb])
), вы получите ожидаемые результаты.
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)
# note: `seed=1` fixes the seed value and thus the sequence of pseudo-random values.
# the PSNR will still yield new values each run, only in a predefined manner.
xxx = box_confidence * box_class_probs
aaa = K.argmax(xxx, axis=-1)
bbb = K.max(xxx, axis=-1, keepdims=False)
# First run:
res_xxx, res_aaa, res_bbb = test_a.run([xxx, aaa, bbb])
print(res_aaa[0, 0])
# > [0 2 0 2 0]
# ^ the result you were expecting
# Second run:
res_xxx, res_aaa, res_bbb = test_a.run([xxx, aaa, bbb])
print(res_aaa[0, 0])
# > [1 1 1 2 1]
# ^ new result, as new pseudo-random values have been picked inside,
# from the sequence predefined by the seeds.