Как правильно вызвать исключение в графе TensorFlow - PullRequest
2 голосов
/ 29 апреля 2020

Я хочу вызвать исключение tf.errors.InvalidArgumentError в зависимости от значения входного тензора в графическом режиме (при обслуживании TensorFlow).

В настоящее время я использую tf.debugging.assert_all_finite, и это прекрасно работает. Поскольку я не делаю утверждение о проверке ошибок, но вырабатываю исключение на основе входных данных, было бы лучше вызвать явное исключение.

Мой вопрос сводится к:

  • Как условно выполнить код, который не возвращает тензор
  • Как вызвать исключение tf.errors.

Как правильно это сделать?

Редактировать: Более подробно. Я хотел бы воссоздать следующую логику c без использования tf.debugging (если это на самом деле не правильный способ сделать это).

В настоящее время я проверяю, что NaN значений, подобных этому:

assert_op = tf.debugging.assert_all_finite(
    input_data,
    'Cant have nans at beginning or end'
)
нет

1 Ответ

1 голос
/ 30 апреля 2020

Как вы написали мне по почте, это может быть связано с этой проблемой TF о перехвате исключений при выполнении графа и с этим связанным вопросом SO . Однако я не совсем уверен, что это действительно актуально для вас. Этот вопрос TF и ​​вопрос SO касались того, как динамически перехватить исключение, поэтому в основном реализуем try: ... except: ... в графике TF.

Другие функции TF, которые вводят структуру управления:

  • tf.while_loop
  • tf.cond

tf.cond - это ответ на ваш вопрос, как вы условно исполняете код. В зависимости от условия, то есть bool скаляр. Но, может, это не ваш вопрос, а, скорее, как сформулировать условие?

Существует tf.check_numerics, который проверяет тензоры на inf / nan и выдает исключение, если такой тензор найден.

Если вы хотите получить это как условие, вы можете использовать этот код:

is_finite = tf.reduce_all(tf.is_finite(x))

Если вы хотите вызвать исключение, если какое-либо условие не выполняется, вы можете выполнить:

check_op = tf.Assert(is_finite, ["Tensor had inf or nan values:", x])

Возможно, вы захотите использовать tf.control_dependencies, чтобы убедиться, что эта операция check_op выполнена.

...