与地面函数平滑近似,可与反向传播配合使用

时间:2019-01-31 16:50:46

标签: python numpy tensorflow math

我一直在尝试实现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 :(得分:0)

如果您想使用重复的expit,我想没有办法解决总和,所以唯一可以做的就是让numpy照顾{{1 }}循环。一种方法是使用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 可以纠正x值不是从零开始的任何情况。