Как я могу напечатать промежуточные состояния для варианта оптимизатора SGD Keras при использовании бэкэнда Tensorflow - PullRequest
1 голос
/ 21 мая 2019

Я хотел бы написать вариант SGD Кераса, который допускает дискретное изменение размера шага на указанных итерациях.Я использую бэкэнд Tensorflow.

Чтобы помочь в отладке, я пытаюсь настроить метод печати сообщений для оптимизатора на get_updates, но я не могу этого сделать.Я пробовал как стандартные операторы печати, так и tf.Print, но ни один из них не работает.Соответствующий код, который идет прямо из crasass оптимизатора Keras SGD, выглядит следующим образом:

@interfaces.legacy_get_updates_support
def get_updates(self, loss, params):
    print (" -------------------------> Getting updates <------------------------------------------")
    grads = self.get_gradients(loss, params)
    self.updates = [K.update_add(self.iterations, 1)]
    tf.Print(self.iterations,
             [self.iterations],
             message="-------------------------------> GETTING UPDATES <----------------------------------------")

    lr = self.lr
    if self.initial_decay > 0:
        lr = lr * (1. / (1. + self.decay * K.cast(self.iterations,
                                                  K.dtype(self.decay))))

    # momentum
    shapes = [K.int_shape(p) for p in params]
    moments = [K.zeros(shape) for shape in shapes]
    self.weights = [self.iterations] + moments
    for p, g, m in zip(params, grads, moments):
        v = self.momentum * m - lr * g  # velocity
        self.updates.append(K.update(m, v))

        if self.nesterov:
            new_p = p + self.momentum * v - lr * g
        else:
            new_p = p + v

        # Apply constraints.
        if getattr(p, 'constraint', None) is not None:
            new_p = p.constraint(new_p)

        self.updates.append(K.update(p, new_p))
    return self.updates

Хотя оператору печати удается передать одно сообщение, и все.Я ожидал увидеть результат каждый раз, когда параметры обновлялись (т.е. после каждой партии).Вместо этого я вижу только распечатанный материал непосредственно перед первой эпохой обучения.

Что я делаю не так?Я все еще связан с трудностями (для меня) работы с вычислениями графа?Кроме того, не должен ли tf.Print произвести вывод текста?

Ответы [ 2 ]

0 голосов
/ 22 мая 2019

Чтобы использовать tf.print в графическом режиме, вы можете просто использовать tf.print в качестве замены для замены tf.Print, вам просто нужно принудительно выполнить операцию tf.print перед выполнением тензор у тебя model function. Вы можете проверить здесь для деталей.

0 голосов
/ 21 мая 2019

Мне кажется, я знаю, что здесь происходит .....

  1. Мой оператор print производит вывод только при вызове get_updates. Он вызывается только один раз и возвращает график (подграф?), Который используется для фактического вычисления обновлений.

  2. My tf.Print не производит вывод, потому что я никогда явно не помещал его в вычислительный граф

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...