как использовать scipy.special.expi (экспоненциальный интеграл) в тензорном потоке? - PullRequest
0 голосов
/ 27 марта 2019

Мне нужно кодировать scipy.special.expi в тензорном потоке, но я не знаю как !!!! пожалуйста, кто-нибудь, помогите так как нет такого прямого кода в тензорном потоке, поэтому я застрял здесь пожалуйста помогите !!!

1 Ответ

0 голосов
/ 27 марта 2019

Я не очень много знаю об этой функции, но на основе реализации Fortran в SciPy, функции EIX в scipy/special/specfun/specfun.f, я собрал реализацию TensorFlow после каждого шага там , Однако это только для положительных значений, так как вычисление для отрицательных значений включает цикл, который сложнее векторизовать.

import math
import tensorflow as tf

def expi(x):
    x = tf.convert_to_tensor(x)
    # When X is zero
    m_0 = tf.equal(x, 0)
    y_0 = -math.inf + tf.zeros_like(x)
    # When X is negative
    m_neg = x < 0
    # This should be -e1xb(-x) according to ScyPy
    # (negative exponential integral -1)
    # Here it is just left as NaN
    y_neg = math.nan + tf.zeros_like(x)
    # When X is less or equal to 40 - Power series around x = 0
    m_le40 = x <= 40
    k = tf.range(1, 101, dtype=x.dtype)
    r = tf.cumprod(tf.expand_dims(x, -1) * k / tf.square(k + 1), axis=-1)
    ga = tf.constant(0.5772156649015328, dtype=x.dtype)
    y_le40 = ga + tf.log(x) + x * (1 + tf.reduce_sum(r, axis=-1))
    # Otherwise (X is greater than 40) - Asymptotic expansion (the series is not convergent)
    k = tf.range(1, 21, dtype=x.dtype)
    r = tf.cumprod(k / tf.expand_dims(x, -1), axis=-1)
    y_gt40 = tf.exp(x) / x * (1 + tf.reduce_sum(r, axis=-1))
    # Select values
    return tf.where(
        m_0, y_0, tf.where(
        m_neg, y_neg, tf.where(
        m_le40, y_le40, y_gt40)))

Небольшой тест

import tensorflow as tf
import scipy.special
import numpy as np

# Test
x = np.linspace(0, 100, 20)
y = scipy.special.expi(x)
with tf.Graph().as_default(), tf.Session() as sess:
    y_tf = sess.run(expi(x))
print(np.allclose(y, y_tf))
# True

Обратите внимание, однако, что это займет больше памяти, чем SciPy, потому что он развертывает циклы аппроксимации в памяти вместо вычисления одного шага за раз.

...