И энергичное, и графическое выполнение в тестах тензорного потока - PullRequest
0 голосов
/ 03 мая 2018

У меня есть несколько тестов, которые работают с графиком и сессиями. Я также хочу написать несколько небольших тестов с активным режимом, чтобы легко проверить некоторые функции. Например:

def test_normal_execution():
    matrix_2x4 = np.array([[1, 2, 3, 4], [6, 7, 8, 9]])
    dataset = tf.data.Dataset.from_tensor_slices(matrix_2x4)
    iterator = dataset.make_one_shot_iterator()
    first_elem = iterator.get_next()
    with tf.Session() as sess:
        result = sess.run(first_elem)
        assert (result == [1, 2, 3, 4]).all()
    sess.close()

В другом файле:

def test_eager_execution():
    matrix_2x4 = np.array([[1, 2, 3, 4], [6, 7, 8, 9]])
    tf.enable_eager_execution()
    dataset = tf.data.Dataset.from_tensor_slices(matrix_2x4)
    iterator = dataset.__iter__()
    first_elem = iterator.next()
    assert (first_elem.numpy() == [1, 2, 3, 4]).all() 

Есть ли способ к этому? Я получаю ValueError: tf.enable_eager_execution must be called at program startup., когда пытаюсь выполнить тест, выполненный с нетерпением. Я использую pytest для запуска своих тестов.

1012 * редактировать *:

С небольшой помощью принятого ответа я создал декоратор, который прекрасно работает с нетерпеливым режимом и приборами pytest:

def run_eagerly(func):
    @functools.wraps(func)
    def eager_fun(*args, **kwargs):
        with tf.Session() as sess:
            sess.run(tfe.py_func(func, inp=list(kwargs.values()), Tout=[]))

    return eager_fun

Ответы [ 2 ]

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

При условии, что что-либо в пространстве имен tf.contrib будет , которое может меняться между выпусками , вы можете украсить свой тест с помощью @tf.contrib.eager.run_test_in_graph_and_eager_modes. Некоторые другие проекты, такие как TensorFlow Probability , похоже, используют это .

Для не-тестов, некоторые вещи, на которые стоит обратить внимание:

  • tf.contrib.eager.defun: полезно, если у вас включено активное выполнение, но вы хотите «скомпилировать» некоторые вычисления в график, чтобы получить выгоду от оптимизации памяти и / или производительности.
  • tf.contrib.eager.py_func: полезно, когда не включено активное выполнение, но требуется выполнить некоторые вычисления в графе как функцию Python.

Кто-то может усомниться в причинах отказа от отмены вызова на tf.enable_eager_execution(). Идея состоит в том, что авторы библиотеки не должны вызывать ее, только конечный пользователь должен вызывать ее в main(). Уменьшается вероятность того, что библиотеки будут написаны несовместимыми способами (где, например, функции в одной библиотеке отключают активное выполнение и возвращают символические тензоры, в то время как функции в другой библиотеке обеспечивают активное выполнение и ожидают конкретных оцененных тензоров. Это затруднит смешивание библиотек).

Надеюсь, это поможет

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

Существует официальный способ использовать активное выполнение в графической среде . Но я не уверен, что это хорошо и достаточно удобно для вас, потому что вам нужно написать довольно много кода, чтобы обернуть и запустить тестовую функцию. В любом случае, вот ваш пример, который должен хотя бы работать:

import numpy as np
import tensorflow as tf

def test_normal_execution():
    matrix_2x4 = np.array([[1, 2, 3, 4], [6, 7, 8, 9]])
    dataset = tf.data.Dataset.from_tensor_slices(matrix_2x4)
    iterator = dataset.make_one_shot_iterator()
    first_elem = iterator.get_next()
    with tf.Session() as sess:
        result = sess.run(first_elem)
        assert (result == [1, 2, 3, 4]).all()
    sess.close()

def test_eager_execution():
    matrix_2x4 = np.array([[1, 2, 3, 4], [6, 7, 8, 9]])
    dataset = tf.data.Dataset.from_tensor_slices(matrix_2x4)
    iterator = dataset.__iter__()
    first_elem = iterator.next()
    assert (first_elem.numpy() == [1, 2, 3, 4]).all()

test_normal_execution()
# test_eager_execution() # Instead, you have to use the following three lines.
with tf.Session() as sess:
    tfe = tf.contrib.eager
    sess.run(tfe.py_func(test_eager_execution, [], []))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...