Keras.max () - Не работает должным образом с tenor.eval () - PullRequest
0 голосов
/ 31 мая 2018

Мой код:

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.Почему?

1 Ответ

0 голосов
/ 31 мая 2018

Недопонимание происходит не от 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.
...