Обработка исключений во время числовой интеграции - PullRequest
0 голосов
/ 17 февраля 2019

Я делаю базовую симуляцию орбитальной механики в TensorFlow.Когда «планета» становится слишком близко к «солнцу» (когда x, y близка к (0,0)), TensorFlow получает исключение во время деления (что может иметь смысл).Каким-то образом он возвращает исключение во время его исключения, вызывая его полный сбой.

Я пытался использовать tf.where, чтобы условно заменить эти деления на нули NaN, однако затем он фактически сталкивается с той же ошибкой.Я также пытался использовать tf.div_no_nan, чтобы получить ноль вместо NaN, но это та же самая ошибка.

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

def gravity(state, t):
    print(len(tf.unstack(state)))
    x, y, vx, vy = tf.unstack(state)
    # Error is related to next two lines
    fx = -x/tf.pow(tf.reduce_sum(tf.square([x,y]),axis=0),3/2)
    fy = -y/tf.pow(tf.reduce_sum(tf.square([x,y]),axis=0),3/2)
    dvx = fx
    dvy = fy
    return tf.stack([vx, vy, dvx, dvy])

# Num simulations
size = 100

# Initialize at same position with varying y-velocity
init_state = tf.stack([tf.constant(-1.0,shape=(size,)),tf.zeros((size)),tf.zeros((size)),tf.range(0,10,.1)])

t = np.linspace(0, 10, num=5000)
tensor_state, tensor_info = tf.contrib.integrate.odeint(
    gravity, init_state, t, full_output=True)

init = tf.global_variables_initializer()
with tf.Session() as sess:   
    state, info = sess.run([tensor_state, tensor_info])
    state = tf.transpose(state, perm=[1,2,0]).eval()

x, y, vx, vy = state
for i in range(10):
    plt.figure()
    plt.plot(x[i], y[i])
    plt.scatter([0],[0])

Я на самом деле получаю

...
InvalidArgumentError: assertion failed: [underflow in dt] [9.0294095248318226e-17]
...
During handling of the above exception, another exception occurred:
...
InvalidArgumentError: assertion failed: [underflow in dt] [9.0294095248318226e-17]
...

Я быкак для деления, чтобы привести к NaN или Бесконечность, а затем распространять это обычно, как и следовало ожидать от численного интегрирования.

1 Ответ

0 голосов
/ 17 февраля 2019

Вы можете попробовать это

with tf.Session() as sess:
    sess.run(init)
    try:
        state, info = sess.run([tensor_state, tensor_info])
    except tf.errors.InvalidArgumentError:
        state = #Whatever values/shape you need

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

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