Плавное приближение к функции пола для использования с обратным распространением - PullRequest
0 голосов
/ 31 января 2019

Я пытался реализовать плавное приближение к функции np.floor.Мне нужна плавная реализация, так как np.floor не может быть распространено обратно в моей программе.

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

import numpy as np
from scipy.special import expit

def multiexpit(x, slope=50):
    y = np.asarray([ expit(slope*(x-i)) for i in range(int(np.max(x))) ])
    return np.sum(y,axis=0)

if __name__=='__main__':
    import matplotlib.pyplot as plt
    x = np.linspace(0,10,1000)
    plt.plot(x,np.floor(x),label='floor')
    plt.plot(x,multiexpit(x-1),label='smooth floor')

Результаты довольно хорошие, однако.Здесь аппроксимация показана для функции пола с параметром температуры slope=50:

enter image description here

Мой вопрос: возможно ли реализовать эту функцию?со временем выполнения, которое не зависит от значения входов?Есть ли у тензорного потока нечто подобное?Я использую NumPy, но проблема та же с TF.

1 Ответ

0 голосов
/ 31 января 2019

Если вы хотите использовать повторный expit, я думаю, что нет никакого способа обойти сумму, поэтому единственное, что вы можете сделать, это позволить numpy позаботиться о цикле for.Один из способов сделать это - преобразовать ваши значения x и позиции шагов в 2d массивы, используя meshgrid:

def multiexpit2(x, slope=50):
    i = np.arange(int(min(x)//1),int(max(x)//1)+1)
    X, I = np.meshgrid(x,i)
    return np.sum(expit(slope*(X-I)),axis=0)+min(x)//1-1

Добавление min(x)//1-1 исправляет любые ситуации, когда ваш x-значения не начинаются с нуля.

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