python - 平滑逼近 floor 函数以用于反向传播

标签 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')

然而,结果相当不错。此处显示了针对 floor 函数的近似值,温度参数 slope=50:

enter image description here

我的问题是,是否可以使用不依赖于输入值的运行时来实现此功能? tensorflow 有类似的东西吗?我正在使用 numpy,但问题与 TF 相同。

最佳答案

如果你想使用重复的expit,我想没有办法绕过总和,所以你唯一能做的就是让numpy取处理 for 循环。一种方法是使用 meshgrid 将您的 x 值和步长的位置转换为二维数组:

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 值不是从零开始的任何情况。

关于python - 平滑逼近 floor 函数以用于反向传播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54465469/

相关文章:

python - 从插值函数中检索值

tensorflow - Keras/Tensorflow 解决线性回归任务的局限性

python - Altair:如何在条形图中包含没有数据的值的位置

python - Pandas Series.apply 不能由字符串组成

python - 将图像作为二维数组导入 python

python - Tensorflow所有预测都是0

python - 损失: nan When build a model for bike sharing

python - salesforce python Beatbox 导入错误

python - 为什么opencv视频读取fps与视频加密fps不同?

python - 嵌套 For 循环 Numpy 数组 : Is vectorizing possible?