首页 > 解决方案 > 平滑逼近用于反向传播的底函数

问题描述

我一直在尝试实现对该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

在此处输入图像描述

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

标签: pythonnumpytensorflowmath

解决方案


如果你想使用重复的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 值不是从零开始的任何情况添加更正。


推荐阅读